用C语言,除了用栈,还有别的方法吗?比如说结构体?
写一个翻转字符串的函数
char * Reverse(const char* string)
{
29 个解决方案
#1
用栈挺好的啊,只是要实现个栈麻烦一点。
用结构体? 不会,呵呵,关注学习
用结构体? 不会,呵呵,关注学习
#2
#3
楼主是不是写错了?
#4
有思想。。个人感觉有点麻烦:
说下大致的思想:
定义个指针; 指针指到最后;指针一个一个左移 遇到'\0'就是“空格”结束,此时把指针所指的输出。。就这样一个一个的输出来。。
这个思想太麻烦。我一时也想不出来,回家在给你想吧!想好了给你贴上。
说下大致的思想:
定义个指针; 指针指到最后;指针一个一个左移 遇到'\0'就是“空格”结束,此时把指针所指的输出。。就这样一个一个的输出来。。
这个思想太麻烦。我一时也想不出来,回家在给你想吧!想好了给你贴上。
#5
#include <stdio.h>
void RevStr(char src[])
{
char *start=src, *end=src, *p=src,e;
int i=0;
do
{
if(*p==' '|| *p==','|| *p=='.'|| *p==';'||! *p)
{
i=1;
end=p-1;
while(start < end)e= *start, *start++= *end, *end--=e;
}
if(i)start=p+1,i=0;
}while(*p++);
while(*end++);end-=2;
while(src < end)e= *src, *src++= *end, *end--=e;
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
int main()
{
char src[]="put up you hands!",pause;
printf("%s\n",src);
RevStr(src);
printf("%s\n",src);
scanf("%c",&pause);
return 0;
}
void RevStr(char src[])
{
char *start=src, *end=src, *p=src,e;
int i=0;
do
{
if(*p==' '|| *p==','|| *p=='.'|| *p==';'||! *p)
{
i=1;
end=p-1;
while(start < end)e= *start, *start++= *end, *end--=e;
}
if(i)start=p+1,i=0;
}while(*p++);
while(*end++);end-=2;
while(src < end)e= *src, *src++= *end, *end--=e;
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
int main()
{
char src[]="put up you hands!",pause;
printf("%s\n",src);
RevStr(src);
printf("%s\n",src);
scanf("%c",&pause);
return 0;
}
#6
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
#include<iterator>
#include<algorithm>
using namespace std;
int main()
{
string test="put up you hands!";
stringstream ss(test);
vector<string> str_vec;
str_vec.assign(istream_iterator<string>(ss),istream_iterator<string>());
ss.clear();
copy(str_vec.rbegin(),str_vec.rend(),ostream_iterator<string>(ss," "));
test=ss.str();
cout<<test<<endl;
system("PAUSE");
return 0;
}
#include<vector>
#include<string>
#include<sstream>
#include<iterator>
#include<algorithm>
using namespace std;
int main()
{
string test="put up you hands!";
stringstream ss(test);
vector<string> str_vec;
str_vec.assign(istream_iterator<string>(ss),istream_iterator<string>());
ss.clear();
copy(str_vec.rbegin(),str_vec.rend(),ostream_iterator<string>(ss," "));
test=ss.str();
cout<<test<<endl;
system("PAUSE");
return 0;
}
#7
敢问下楼上的学C多少年拉 从事计算机这行多少年拉?
崇拜
崇拜
#8
这个问题好像已经有很多兄弟研究过了
也提出了很多简单有效的方法
今天既然有人提出用栈 把以前写过的一个只有5各元素大小的模拟栈实现贴出来凑凑数吧
写得很粗糙 不好意思了
#include <tchar.h>
#include <iostream>
#include <windows.h>
using namespace std;
void sentenceReverse(const char* strIn, char* strOut)
{
int len = 0;
int i = 0;
int count = 0;
int countSpace = 0;
char *temp[5];
for(int j = 0; j < 5, *(strIn + i) != '\0'; j++){
temp[j] = new char;
while(*(strIn + i) != '\40'&& *(strIn + i) != '\0' && *(strIn + i) != '.' && *(strIn + i) != '!'){
i++;
}
memcpy(temp[j], strIn + count, i - count);
memcpy(temp[j] + i - count + 1, "\0", 1);
if(*(strIn + i) == '\40'){
countSpace++;
}
count = 1 + i++;
}
for(; j < 5; j++){
temp[j] = new char;
memcpy(temp[j], "\0", 1);
}
char *stack[5];
for(int k = 0; k < 5; k++){
stack[k] = temp[4 - k];
}
for(k = 4 - countSpace; k < 5; k++){
memcpy(strOut + len, stack[k], strlen(stack[k]));
len = len + static_cast<int>(strlen(stack[k]));
memcpy(strOut + len - 1, "\40", 1);
}
cout << strOut << endl;
delete [] (*stack);
}
int _tmain(int argc, _TCHAR* argv[])
{
char* str = "i am a student!";
char* strOut = new char(static_cast<int>(strlen(str)));
sentenceReverse(str, strOut);
Sleep(5000);
return 0;
}
也提出了很多简单有效的方法
今天既然有人提出用栈 把以前写过的一个只有5各元素大小的模拟栈实现贴出来凑凑数吧
写得很粗糙 不好意思了
#include <tchar.h>
#include <iostream>
#include <windows.h>
using namespace std;
void sentenceReverse(const char* strIn, char* strOut)
{
int len = 0;
int i = 0;
int count = 0;
int countSpace = 0;
char *temp[5];
for(int j = 0; j < 5, *(strIn + i) != '\0'; j++){
temp[j] = new char;
while(*(strIn + i) != '\40'&& *(strIn + i) != '\0' && *(strIn + i) != '.' && *(strIn + i) != '!'){
i++;
}
memcpy(temp[j], strIn + count, i - count);
memcpy(temp[j] + i - count + 1, "\0", 1);
if(*(strIn + i) == '\40'){
countSpace++;
}
count = 1 + i++;
}
for(; j < 5; j++){
temp[j] = new char;
memcpy(temp[j], "\0", 1);
}
char *stack[5];
for(int k = 0; k < 5; k++){
stack[k] = temp[4 - k];
}
for(k = 4 - countSpace; k < 5; k++){
memcpy(strOut + len, stack[k], strlen(stack[k]));
len = len + static_cast<int>(strlen(stack[k]));
memcpy(strOut + len - 1, "\40", 1);
}
cout << strOut << endl;
delete [] (*stack);
}
int _tmain(int argc, _TCHAR* argv[])
{
char* str = "i am a student!";
char* strOut = new char(static_cast<int>(strlen(str)));
sentenceReverse(str, strOut);
Sleep(5000);
return 0;
}
#9
学习
#10
可以去俺的blog瞅瞅
http://blog.csdn.net/ammana_babi/archive/2006/09/11/1207025.aspx
本程序在Turbo C 2.0下编译通过,在使用VC.NET和Dev C++ 4.9 进行编译的时候提示写冲突。
#include <stdio.h>
char * mystrcat(char * dst,const char *src)
{
char *start = dst;
while(*dst)dst++;
while(*dst++ = *src++);
return start;
}/*其实就是C库函数strcat(),因为不让使用C库函数,所以只好自己写出来了。*/
char * wordrev(char *str)
{
char *start,*p,*pp;
p=(char *)str;
pp =p;
while(*p) p++;
while(*p != ' ') p--;
start = p+1;
*p = '\0';
while(p >= pp)
{
while(*p != ' ')
{
p--;
if(p == pp)
{
mystrcat(start," ");
mystrcat(start,p);
break;
}
}
if(p != pp)
{
mystrcat(start,p);
*p = '\0';
}
}
return start;
}
void main(void)
{
char * str = "I am a student";
puts(wordrev(str));
getchar();
}
http://blog.csdn.net/ammana_babi/archive/2006/09/11/1207025.aspx
本程序在Turbo C 2.0下编译通过,在使用VC.NET和Dev C++ 4.9 进行编译的时候提示写冲突。
#include <stdio.h>
char * mystrcat(char * dst,const char *src)
{
char *start = dst;
while(*dst)dst++;
while(*dst++ = *src++);
return start;
}/*其实就是C库函数strcat(),因为不让使用C库函数,所以只好自己写出来了。*/
char * wordrev(char *str)
{
char *start,*p,*pp;
p=(char *)str;
pp =p;
while(*p) p++;
while(*p != ' ') p--;
start = p+1;
*p = '\0';
while(p >= pp)
{
while(*p != ' ')
{
p--;
if(p == pp)
{
mystrcat(start," ");
mystrcat(start,p);
break;
}
}
if(p != pp)
{
mystrcat(start,p);
*p = '\0';
}
}
return start;
}
void main(void)
{
char * str = "I am a student";
puts(wordrev(str));
getchar();
}
#11
CSDN里的牛人真多,崇拜你们啊!
#12
結構體也不是不行,
typedef struct{
char *out;
}linker;
linker str[N];
char * Reverse(const char* string)
{
int i;
str[0].out=strtok(string," ");
while(str[++i].out=strtok(NULL," "));
for(--i;i>=0;i--) printf("%s ",str[i].out);
}
//手上沒有編譯器沒有調適,參考一下ba le
typedef struct{
char *out;
}linker;
linker str[N];
char * Reverse(const char* string)
{
int i;
str[0].out=strtok(string," ");
while(str[++i].out=strtok(NULL," "));
for(--i;i>=0;i--) printf("%s ",str[i].out);
}
//手上沒有編譯器沒有調適,參考一下ba le
#13
i=0開始沒有給值,+上去吧
#14
为什么我的程序执行到 *p='\0' 就会报内存出错?
#15
用堆栈的实现
#include <stdio.h>
#include <stdlib.h>
struct s_node{
char data;
struct s_node *next;
};
typedef struct s_node s_list;
typedef s_list *link;
link stack;
void push(char data){
link newnode;
newnode = (link)malloc(sizeof(s_list));
newnode->data = data;
newnode->next = stack;
stack = newnode;
}
char pop(){
link top;
char temp;
top = stack;
stack = stack->next;
temp = top->data;
free(top);
return temp;
}
int main(int argc, char **argv){
printf("this is a stringreverse c file!\n");
char *str = "put up your hands! yuy yuyu uyuy";
char *temp = str;
while(*temp)temp++;
int num = 0;
int init = 0;
temp--;
while(*str){
if(init == 0){
push(' ');
init++;
num++;
}
push(*(temp--));
num++;
if(*temp == ' '){
while(num > 0){
printf("%c",pop());
num--;
}
}
str++;
}
while(num > 0){
printf("%c",pop());
num--;
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
struct s_node{
char data;
struct s_node *next;
};
typedef struct s_node s_list;
typedef s_list *link;
link stack;
void push(char data){
link newnode;
newnode = (link)malloc(sizeof(s_list));
newnode->data = data;
newnode->next = stack;
stack = newnode;
}
char pop(){
link top;
char temp;
top = stack;
stack = stack->next;
temp = top->data;
free(top);
return temp;
}
int main(int argc, char **argv){
printf("this is a stringreverse c file!\n");
char *str = "put up your hands! yuy yuyu uyuy";
char *temp = str;
while(*temp)temp++;
int num = 0;
int init = 0;
temp--;
while(*str){
if(init == 0){
push(' ');
init++;
num++;
}
push(*(temp--));
num++;
if(*temp == ' '){
while(num > 0){
printf("%c",pop());
num--;
}
}
str++;
}
while(num > 0){
printf("%c",pop());
num--;
}
return 0;
}
#16
mark
#17
我的思路是先在空格的地方赋‘\0’,在从后向前查找下个‘\0’,输入‘\0’后面的字符串,
#18
不用栈,可以用循环~
#19
昨天刚好做了一个
#include <iostream.h>
char str[]= "hands! you up put";
void rev( char* p, int l)
{
char *h=p, *t=p+l;
char c;
int count=0;
while(count!=l/2+1)
{
c=*t;
*t=*h;
*h=c;
t--;
h++;
count++;
}
}
int findl( char* p,char ch)
{
char *pt=p;
int count=0;
while( (*pt!=ch) && (*pt!='\0') )
{
count++;
pt++;
}
return count;
}
void main()
{
int len;
int ch=' ';
len=findl(str, '\0');
rev(str,len-1);
char *p=str;
while( *p!='\0')
{
while(*p==ch)
{
p++;
}
int l=findl(p,ch);
rev(p, l-1);
p=p+l;
}
cout<<str<<endl;
}
#include <iostream.h>
char str[]= "hands! you up put";
void rev( char* p, int l)
{
char *h=p, *t=p+l;
char c;
int count=0;
while(count!=l/2+1)
{
c=*t;
*t=*h;
*h=c;
t--;
h++;
count++;
}
}
int findl( char* p,char ch)
{
char *pt=p;
int count=0;
while( (*pt!=ch) && (*pt!='\0') )
{
count++;
pt++;
}
return count;
}
void main()
{
int len;
int ch=' ';
len=findl(str, '\0');
rev(str,len-1);
char *p=str;
while( *p!='\0')
{
while(*p==ch)
{
p++;
}
int l=findl(p,ch);
rev(p, l-1);
p=p+l;
}
cout<<str<<endl;
}
#20
有du51(郁郁思扬)这么好的解决方案,还要说其它的吗?
#21
void reverseWords(char str[])
{
int start=0,end=0,length;
length=strlen(str);
ReverseString(str,start,length-1);
while(end<length){
if(str[end]!=' '){
start=end;
while(end<length&&str[end]!=' ')
end++;
end--;
ReverseString(str,start,end);
}
end++;
}
return;
}
void Reversestring(char str[],int start,int end){
char temp;
while(end>start){
temp=str[start];
str[start]=str[end];
str[end]=temp;
start++; end--;
}
return;
}
{
int start=0,end=0,length;
length=strlen(str);
ReverseString(str,start,length-1);
while(end<length){
if(str[end]!=' '){
start=end;
while(end<length&&str[end]!=' ')
end++;
end--;
ReverseString(str,start,end);
}
end++;
}
return;
}
void Reversestring(char str[],int start,int end){
char temp;
while(end>start){
temp=str[start];
str[start]=str[end];
str[end]=temp;
start++; end--;
}
return;
}
#22
呵呵 学C刚一个月 应该是最低级的方法做的 看看好使不? 好使楼主自己转换为函数 :)
#include<stdio.h>
#include<string.h>
void main()
{
char name1[50];
char name2[50];
char temp;
int i,j,n,k,s,m=-1;
printf("请输入你要调换单词顺序的字符串:\n");
fflush(stdin);
gets(name1);
n=strlen(name1);
for(i=0,j=n-1;i<n;i++,j--)
{
name2[i]=name1[j];
}
for(i=0;i<n;i++)
{
if(name2[i]==' ')
{
k=m+1;
m=i;
for(s=0,j=k;s<(m-k)/2;s++,j++)
{
temp=name2[j];
name2[j]=name2[m-1-s];
name2[m-1-s]=temp;
}
}
}
k=m+1;
for(j=k,s=0;s<(n-k)/2;j++,s++)
{
temp=name2[k];
name2[k]=name2[n-s-1];
name2[n-s-1]=temp;
}
name2[n]='\0';
printf("\n%s\n",name2);
}
#include<stdio.h>
#include<string.h>
void main()
{
char name1[50];
char name2[50];
char temp;
int i,j,n,k,s,m=-1;
printf("请输入你要调换单词顺序的字符串:\n");
fflush(stdin);
gets(name1);
n=strlen(name1);
for(i=0,j=n-1;i<n;i++,j--)
{
name2[i]=name1[j];
}
for(i=0;i<n;i++)
{
if(name2[i]==' ')
{
k=m+1;
m=i;
for(s=0,j=k;s<(m-k)/2;s++,j++)
{
temp=name2[j];
name2[j]=name2[m-1-s];
name2[m-1-s]=temp;
}
}
}
k=m+1;
for(j=k,s=0;s<(n-k)/2;j++,s++)
{
temp=name2[k];
name2[k]=name2[n-s-1];
name2[n-s-1]=temp;
}
name2[n]='\0';
printf("\n%s\n",name2);
}
#23
上面有个小错误 修改后如下 不好意思啊 粗心大意了 修改后简洁点
#include<stdio.h>
#include<string.h>
void main()
{
char name1[50];
char name2[50];
char temp;
int i,j,n,k,s,m=-1;
printf("请输入你要调换单词顺序的字符串:\n");
fflush(stdin);
gets(name1);
n=strlen(name1);
for(i=0,j=n-1;i<n;i++,j--)
{
name2[i]=name1[j];
}
for(i=0;i<n;i++)
{
if(name2[i]==' ')
{
k=m+1;
m=i;
for(s=0,j=k;s<(m-k)/2;s++,j++)
{
temp=name2[j];
name2[j]=name2[m-1-s];
name2[m-1-s]=temp;
}
}
}
k=m+1;
for(j=k,s=0;s<(n-k)/2;j++,s++)
{
temp=name2[k];
name2[k]=name2[n-s-1];
name2[n-s-1]=temp;
}
name2[n]='\0';
printf("\n%s\n",name2);
}
#include<stdio.h>
#include<string.h>
void main()
{
char name1[50];
char name2[50];
char temp;
int i,j,n,k,s,m=-1;
printf("请输入你要调换单词顺序的字符串:\n");
fflush(stdin);
gets(name1);
n=strlen(name1);
for(i=0,j=n-1;i<n;i++,j--)
{
name2[i]=name1[j];
}
for(i=0;i<n;i++)
{
if(name2[i]==' ')
{
k=m+1;
m=i;
for(s=0,j=k;s<(m-k)/2;s++,j++)
{
temp=name2[j];
name2[j]=name2[m-1-s];
name2[m-1-s]=temp;
}
}
}
k=m+1;
for(j=k,s=0;s<(n-k)/2;j++,s++)
{
temp=name2[k];
name2[k]=name2[n-s-1];
name2[n-s-1]=temp;
}
name2[n]='\0';
printf("\n%s\n",name2);
}
#24
汗 复制错误 再发
#include<stdio.h>
#include<string.h>
void main()
{
char name1[50];
char name2[50];
char temp;
int i,j,n,k,s,m=-1;
printf("请输入你要调换单词顺序的字符串:\n");
fflush(stdin);
gets(name1);
n=strlen(name1);
for(i=0,j=n-1;i<n;i++,j--)
{
name2[i]=name1[j];
}
name2[n]=' ';
for(i=0;i<=n;i++)
{
if(name2[i]==' ')
{
k=m+1;
m=i;
for(s=0,j=k;s<(m-k)/2;s++,j++)
{
temp=name2[j];
name2[j]=name2[m-1-s];
name2[m-1-s]=temp;
}
}
}
name2[n]='\0';
printf("\n%s\n",name2);
}
#include<stdio.h>
#include<string.h>
void main()
{
char name1[50];
char name2[50];
char temp;
int i,j,n,k,s,m=-1;
printf("请输入你要调换单词顺序的字符串:\n");
fflush(stdin);
gets(name1);
n=strlen(name1);
for(i=0,j=n-1;i<n;i++,j--)
{
name2[i]=name1[j];
}
name2[n]=' ';
for(i=0;i<=n;i++)
{
if(name2[i]==' ')
{
k=m+1;
m=i;
for(s=0,j=k;s<(m-k)/2;s++,j++)
{
temp=name2[j];
name2[j]=name2[m-1-s];
name2[m-1-s]=temp;
}
}
}
name2[n]='\0';
printf("\n%s\n",name2);
}
#25
w 是来拜牛人的..
#26
好好利用用下那个空格就行了啊~~~~~~~~~~~~~~~用那个空格来判断,把空格转换成ASCII后判断,然后截取后在重新组装下就OK了~~~~~~~~~~~~~
#27
用指针移动最简单
#28
#include<stdio.h>
#include<string.h>
void main()
{
char str[11]={"I LOVE YOU"};
char st[11];
int i=0;
st[10]='\0';
char *p;
p=str;
for(i=0;i<3;i++)
st[i]=*(p+7+i);
st[3]=32;
for(i=0;i<4;i++)
st[i+4]=*(p+i+2);
st[8]=32;
st[9]=*p;
printf("%s\n",st);
}
#include<string.h>
void main()
{
char str[11]={"I LOVE YOU"};
char st[11];
int i=0;
st[10]='\0';
char *p;
p=str;
for(i=0;i<3;i++)
st[i]=*(p+7+i);
st[3]=32;
for(i=0;i<4;i++)
st[i+4]=*(p+i+2);
st[8]=32;
st[9]=*p;
printf("%s\n",st);
}
#29
http://community.csdn.net/Expert/topic/5232/5232012.xml?temp=.9141962
[超级大笨狼]提供三万单词库备份下载,MS-SQL 2000格式,下载请“自觉”捐赠可用分给我。
[超级大笨狼]提供三万单词库备份下载,MS-SQL 2000格式,下载请“自觉”捐赠可用分给我。
#1
用栈挺好的啊,只是要实现个栈麻烦一点。
用结构体? 不会,呵呵,关注学习
用结构体? 不会,呵呵,关注学习
#2
#3
楼主是不是写错了?
#4
有思想。。个人感觉有点麻烦:
说下大致的思想:
定义个指针; 指针指到最后;指针一个一个左移 遇到'\0'就是“空格”结束,此时把指针所指的输出。。就这样一个一个的输出来。。
这个思想太麻烦。我一时也想不出来,回家在给你想吧!想好了给你贴上。
说下大致的思想:
定义个指针; 指针指到最后;指针一个一个左移 遇到'\0'就是“空格”结束,此时把指针所指的输出。。就这样一个一个的输出来。。
这个思想太麻烦。我一时也想不出来,回家在给你想吧!想好了给你贴上。
#5
#include <stdio.h>
void RevStr(char src[])
{
char *start=src, *end=src, *p=src,e;
int i=0;
do
{
if(*p==' '|| *p==','|| *p=='.'|| *p==';'||! *p)
{
i=1;
end=p-1;
while(start < end)e= *start, *start++= *end, *end--=e;
}
if(i)start=p+1,i=0;
}while(*p++);
while(*end++);end-=2;
while(src < end)e= *src, *src++= *end, *end--=e;
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
int main()
{
char src[]="put up you hands!",pause;
printf("%s\n",src);
RevStr(src);
printf("%s\n",src);
scanf("%c",&pause);
return 0;
}
void RevStr(char src[])
{
char *start=src, *end=src, *p=src,e;
int i=0;
do
{
if(*p==' '|| *p==','|| *p=='.'|| *p==';'||! *p)
{
i=1;
end=p-1;
while(start < end)e= *start, *start++= *end, *end--=e;
}
if(i)start=p+1,i=0;
}while(*p++);
while(*end++);end-=2;
while(src < end)e= *src, *src++= *end, *end--=e;
}
//-------------------------------------------------------------------------
//
//-------------------------------------------------------------------------
int main()
{
char src[]="put up you hands!",pause;
printf("%s\n",src);
RevStr(src);
printf("%s\n",src);
scanf("%c",&pause);
return 0;
}
#6
#include<iostream>
#include<vector>
#include<string>
#include<sstream>
#include<iterator>
#include<algorithm>
using namespace std;
int main()
{
string test="put up you hands!";
stringstream ss(test);
vector<string> str_vec;
str_vec.assign(istream_iterator<string>(ss),istream_iterator<string>());
ss.clear();
copy(str_vec.rbegin(),str_vec.rend(),ostream_iterator<string>(ss," "));
test=ss.str();
cout<<test<<endl;
system("PAUSE");
return 0;
}
#include<vector>
#include<string>
#include<sstream>
#include<iterator>
#include<algorithm>
using namespace std;
int main()
{
string test="put up you hands!";
stringstream ss(test);
vector<string> str_vec;
str_vec.assign(istream_iterator<string>(ss),istream_iterator<string>());
ss.clear();
copy(str_vec.rbegin(),str_vec.rend(),ostream_iterator<string>(ss," "));
test=ss.str();
cout<<test<<endl;
system("PAUSE");
return 0;
}
#7
敢问下楼上的学C多少年拉 从事计算机这行多少年拉?
崇拜
崇拜
#8
这个问题好像已经有很多兄弟研究过了
也提出了很多简单有效的方法
今天既然有人提出用栈 把以前写过的一个只有5各元素大小的模拟栈实现贴出来凑凑数吧
写得很粗糙 不好意思了
#include <tchar.h>
#include <iostream>
#include <windows.h>
using namespace std;
void sentenceReverse(const char* strIn, char* strOut)
{
int len = 0;
int i = 0;
int count = 0;
int countSpace = 0;
char *temp[5];
for(int j = 0; j < 5, *(strIn + i) != '\0'; j++){
temp[j] = new char;
while(*(strIn + i) != '\40'&& *(strIn + i) != '\0' && *(strIn + i) != '.' && *(strIn + i) != '!'){
i++;
}
memcpy(temp[j], strIn + count, i - count);
memcpy(temp[j] + i - count + 1, "\0", 1);
if(*(strIn + i) == '\40'){
countSpace++;
}
count = 1 + i++;
}
for(; j < 5; j++){
temp[j] = new char;
memcpy(temp[j], "\0", 1);
}
char *stack[5];
for(int k = 0; k < 5; k++){
stack[k] = temp[4 - k];
}
for(k = 4 - countSpace; k < 5; k++){
memcpy(strOut + len, stack[k], strlen(stack[k]));
len = len + static_cast<int>(strlen(stack[k]));
memcpy(strOut + len - 1, "\40", 1);
}
cout << strOut << endl;
delete [] (*stack);
}
int _tmain(int argc, _TCHAR* argv[])
{
char* str = "i am a student!";
char* strOut = new char(static_cast<int>(strlen(str)));
sentenceReverse(str, strOut);
Sleep(5000);
return 0;
}
也提出了很多简单有效的方法
今天既然有人提出用栈 把以前写过的一个只有5各元素大小的模拟栈实现贴出来凑凑数吧
写得很粗糙 不好意思了
#include <tchar.h>
#include <iostream>
#include <windows.h>
using namespace std;
void sentenceReverse(const char* strIn, char* strOut)
{
int len = 0;
int i = 0;
int count = 0;
int countSpace = 0;
char *temp[5];
for(int j = 0; j < 5, *(strIn + i) != '\0'; j++){
temp[j] = new char;
while(*(strIn + i) != '\40'&& *(strIn + i) != '\0' && *(strIn + i) != '.' && *(strIn + i) != '!'){
i++;
}
memcpy(temp[j], strIn + count, i - count);
memcpy(temp[j] + i - count + 1, "\0", 1);
if(*(strIn + i) == '\40'){
countSpace++;
}
count = 1 + i++;
}
for(; j < 5; j++){
temp[j] = new char;
memcpy(temp[j], "\0", 1);
}
char *stack[5];
for(int k = 0; k < 5; k++){
stack[k] = temp[4 - k];
}
for(k = 4 - countSpace; k < 5; k++){
memcpy(strOut + len, stack[k], strlen(stack[k]));
len = len + static_cast<int>(strlen(stack[k]));
memcpy(strOut + len - 1, "\40", 1);
}
cout << strOut << endl;
delete [] (*stack);
}
int _tmain(int argc, _TCHAR* argv[])
{
char* str = "i am a student!";
char* strOut = new char(static_cast<int>(strlen(str)));
sentenceReverse(str, strOut);
Sleep(5000);
return 0;
}
#9
学习
#10
可以去俺的blog瞅瞅
http://blog.csdn.net/ammana_babi/archive/2006/09/11/1207025.aspx
本程序在Turbo C 2.0下编译通过,在使用VC.NET和Dev C++ 4.9 进行编译的时候提示写冲突。
#include <stdio.h>
char * mystrcat(char * dst,const char *src)
{
char *start = dst;
while(*dst)dst++;
while(*dst++ = *src++);
return start;
}/*其实就是C库函数strcat(),因为不让使用C库函数,所以只好自己写出来了。*/
char * wordrev(char *str)
{
char *start,*p,*pp;
p=(char *)str;
pp =p;
while(*p) p++;
while(*p != ' ') p--;
start = p+1;
*p = '\0';
while(p >= pp)
{
while(*p != ' ')
{
p--;
if(p == pp)
{
mystrcat(start," ");
mystrcat(start,p);
break;
}
}
if(p != pp)
{
mystrcat(start,p);
*p = '\0';
}
}
return start;
}
void main(void)
{
char * str = "I am a student";
puts(wordrev(str));
getchar();
}
http://blog.csdn.net/ammana_babi/archive/2006/09/11/1207025.aspx
本程序在Turbo C 2.0下编译通过,在使用VC.NET和Dev C++ 4.9 进行编译的时候提示写冲突。
#include <stdio.h>
char * mystrcat(char * dst,const char *src)
{
char *start = dst;
while(*dst)dst++;
while(*dst++ = *src++);
return start;
}/*其实就是C库函数strcat(),因为不让使用C库函数,所以只好自己写出来了。*/
char * wordrev(char *str)
{
char *start,*p,*pp;
p=(char *)str;
pp =p;
while(*p) p++;
while(*p != ' ') p--;
start = p+1;
*p = '\0';
while(p >= pp)
{
while(*p != ' ')
{
p--;
if(p == pp)
{
mystrcat(start," ");
mystrcat(start,p);
break;
}
}
if(p != pp)
{
mystrcat(start,p);
*p = '\0';
}
}
return start;
}
void main(void)
{
char * str = "I am a student";
puts(wordrev(str));
getchar();
}
#11
CSDN里的牛人真多,崇拜你们啊!
#12
結構體也不是不行,
typedef struct{
char *out;
}linker;
linker str[N];
char * Reverse(const char* string)
{
int i;
str[0].out=strtok(string," ");
while(str[++i].out=strtok(NULL," "));
for(--i;i>=0;i--) printf("%s ",str[i].out);
}
//手上沒有編譯器沒有調適,參考一下ba le
typedef struct{
char *out;
}linker;
linker str[N];
char * Reverse(const char* string)
{
int i;
str[0].out=strtok(string," ");
while(str[++i].out=strtok(NULL," "));
for(--i;i>=0;i--) printf("%s ",str[i].out);
}
//手上沒有編譯器沒有調適,參考一下ba le
#13
i=0開始沒有給值,+上去吧
#14
为什么我的程序执行到 *p='\0' 就会报内存出错?
#15
用堆栈的实现
#include <stdio.h>
#include <stdlib.h>
struct s_node{
char data;
struct s_node *next;
};
typedef struct s_node s_list;
typedef s_list *link;
link stack;
void push(char data){
link newnode;
newnode = (link)malloc(sizeof(s_list));
newnode->data = data;
newnode->next = stack;
stack = newnode;
}
char pop(){
link top;
char temp;
top = stack;
stack = stack->next;
temp = top->data;
free(top);
return temp;
}
int main(int argc, char **argv){
printf("this is a stringreverse c file!\n");
char *str = "put up your hands! yuy yuyu uyuy";
char *temp = str;
while(*temp)temp++;
int num = 0;
int init = 0;
temp--;
while(*str){
if(init == 0){
push(' ');
init++;
num++;
}
push(*(temp--));
num++;
if(*temp == ' '){
while(num > 0){
printf("%c",pop());
num--;
}
}
str++;
}
while(num > 0){
printf("%c",pop());
num--;
}
return 0;
}
#include <stdio.h>
#include <stdlib.h>
struct s_node{
char data;
struct s_node *next;
};
typedef struct s_node s_list;
typedef s_list *link;
link stack;
void push(char data){
link newnode;
newnode = (link)malloc(sizeof(s_list));
newnode->data = data;
newnode->next = stack;
stack = newnode;
}
char pop(){
link top;
char temp;
top = stack;
stack = stack->next;
temp = top->data;
free(top);
return temp;
}
int main(int argc, char **argv){
printf("this is a stringreverse c file!\n");
char *str = "put up your hands! yuy yuyu uyuy";
char *temp = str;
while(*temp)temp++;
int num = 0;
int init = 0;
temp--;
while(*str){
if(init == 0){
push(' ');
init++;
num++;
}
push(*(temp--));
num++;
if(*temp == ' '){
while(num > 0){
printf("%c",pop());
num--;
}
}
str++;
}
while(num > 0){
printf("%c",pop());
num--;
}
return 0;
}
#16
mark
#17
我的思路是先在空格的地方赋‘\0’,在从后向前查找下个‘\0’,输入‘\0’后面的字符串,
#18
不用栈,可以用循环~
#19
昨天刚好做了一个
#include <iostream.h>
char str[]= "hands! you up put";
void rev( char* p, int l)
{
char *h=p, *t=p+l;
char c;
int count=0;
while(count!=l/2+1)
{
c=*t;
*t=*h;
*h=c;
t--;
h++;
count++;
}
}
int findl( char* p,char ch)
{
char *pt=p;
int count=0;
while( (*pt!=ch) && (*pt!='\0') )
{
count++;
pt++;
}
return count;
}
void main()
{
int len;
int ch=' ';
len=findl(str, '\0');
rev(str,len-1);
char *p=str;
while( *p!='\0')
{
while(*p==ch)
{
p++;
}
int l=findl(p,ch);
rev(p, l-1);
p=p+l;
}
cout<<str<<endl;
}
#include <iostream.h>
char str[]= "hands! you up put";
void rev( char* p, int l)
{
char *h=p, *t=p+l;
char c;
int count=0;
while(count!=l/2+1)
{
c=*t;
*t=*h;
*h=c;
t--;
h++;
count++;
}
}
int findl( char* p,char ch)
{
char *pt=p;
int count=0;
while( (*pt!=ch) && (*pt!='\0') )
{
count++;
pt++;
}
return count;
}
void main()
{
int len;
int ch=' ';
len=findl(str, '\0');
rev(str,len-1);
char *p=str;
while( *p!='\0')
{
while(*p==ch)
{
p++;
}
int l=findl(p,ch);
rev(p, l-1);
p=p+l;
}
cout<<str<<endl;
}
#20
有du51(郁郁思扬)这么好的解决方案,还要说其它的吗?
#21
void reverseWords(char str[])
{
int start=0,end=0,length;
length=strlen(str);
ReverseString(str,start,length-1);
while(end<length){
if(str[end]!=' '){
start=end;
while(end<length&&str[end]!=' ')
end++;
end--;
ReverseString(str,start,end);
}
end++;
}
return;
}
void Reversestring(char str[],int start,int end){
char temp;
while(end>start){
temp=str[start];
str[start]=str[end];
str[end]=temp;
start++; end--;
}
return;
}
{
int start=0,end=0,length;
length=strlen(str);
ReverseString(str,start,length-1);
while(end<length){
if(str[end]!=' '){
start=end;
while(end<length&&str[end]!=' ')
end++;
end--;
ReverseString(str,start,end);
}
end++;
}
return;
}
void Reversestring(char str[],int start,int end){
char temp;
while(end>start){
temp=str[start];
str[start]=str[end];
str[end]=temp;
start++; end--;
}
return;
}
#22
呵呵 学C刚一个月 应该是最低级的方法做的 看看好使不? 好使楼主自己转换为函数 :)
#include<stdio.h>
#include<string.h>
void main()
{
char name1[50];
char name2[50];
char temp;
int i,j,n,k,s,m=-1;
printf("请输入你要调换单词顺序的字符串:\n");
fflush(stdin);
gets(name1);
n=strlen(name1);
for(i=0,j=n-1;i<n;i++,j--)
{
name2[i]=name1[j];
}
for(i=0;i<n;i++)
{
if(name2[i]==' ')
{
k=m+1;
m=i;
for(s=0,j=k;s<(m-k)/2;s++,j++)
{
temp=name2[j];
name2[j]=name2[m-1-s];
name2[m-1-s]=temp;
}
}
}
k=m+1;
for(j=k,s=0;s<(n-k)/2;j++,s++)
{
temp=name2[k];
name2[k]=name2[n-s-1];
name2[n-s-1]=temp;
}
name2[n]='\0';
printf("\n%s\n",name2);
}
#include<stdio.h>
#include<string.h>
void main()
{
char name1[50];
char name2[50];
char temp;
int i,j,n,k,s,m=-1;
printf("请输入你要调换单词顺序的字符串:\n");
fflush(stdin);
gets(name1);
n=strlen(name1);
for(i=0,j=n-1;i<n;i++,j--)
{
name2[i]=name1[j];
}
for(i=0;i<n;i++)
{
if(name2[i]==' ')
{
k=m+1;
m=i;
for(s=0,j=k;s<(m-k)/2;s++,j++)
{
temp=name2[j];
name2[j]=name2[m-1-s];
name2[m-1-s]=temp;
}
}
}
k=m+1;
for(j=k,s=0;s<(n-k)/2;j++,s++)
{
temp=name2[k];
name2[k]=name2[n-s-1];
name2[n-s-1]=temp;
}
name2[n]='\0';
printf("\n%s\n",name2);
}
#23
上面有个小错误 修改后如下 不好意思啊 粗心大意了 修改后简洁点
#include<stdio.h>
#include<string.h>
void main()
{
char name1[50];
char name2[50];
char temp;
int i,j,n,k,s,m=-1;
printf("请输入你要调换单词顺序的字符串:\n");
fflush(stdin);
gets(name1);
n=strlen(name1);
for(i=0,j=n-1;i<n;i++,j--)
{
name2[i]=name1[j];
}
for(i=0;i<n;i++)
{
if(name2[i]==' ')
{
k=m+1;
m=i;
for(s=0,j=k;s<(m-k)/2;s++,j++)
{
temp=name2[j];
name2[j]=name2[m-1-s];
name2[m-1-s]=temp;
}
}
}
k=m+1;
for(j=k,s=0;s<(n-k)/2;j++,s++)
{
temp=name2[k];
name2[k]=name2[n-s-1];
name2[n-s-1]=temp;
}
name2[n]='\0';
printf("\n%s\n",name2);
}
#include<stdio.h>
#include<string.h>
void main()
{
char name1[50];
char name2[50];
char temp;
int i,j,n,k,s,m=-1;
printf("请输入你要调换单词顺序的字符串:\n");
fflush(stdin);
gets(name1);
n=strlen(name1);
for(i=0,j=n-1;i<n;i++,j--)
{
name2[i]=name1[j];
}
for(i=0;i<n;i++)
{
if(name2[i]==' ')
{
k=m+1;
m=i;
for(s=0,j=k;s<(m-k)/2;s++,j++)
{
temp=name2[j];
name2[j]=name2[m-1-s];
name2[m-1-s]=temp;
}
}
}
k=m+1;
for(j=k,s=0;s<(n-k)/2;j++,s++)
{
temp=name2[k];
name2[k]=name2[n-s-1];
name2[n-s-1]=temp;
}
name2[n]='\0';
printf("\n%s\n",name2);
}
#24
汗 复制错误 再发
#include<stdio.h>
#include<string.h>
void main()
{
char name1[50];
char name2[50];
char temp;
int i,j,n,k,s,m=-1;
printf("请输入你要调换单词顺序的字符串:\n");
fflush(stdin);
gets(name1);
n=strlen(name1);
for(i=0,j=n-1;i<n;i++,j--)
{
name2[i]=name1[j];
}
name2[n]=' ';
for(i=0;i<=n;i++)
{
if(name2[i]==' ')
{
k=m+1;
m=i;
for(s=0,j=k;s<(m-k)/2;s++,j++)
{
temp=name2[j];
name2[j]=name2[m-1-s];
name2[m-1-s]=temp;
}
}
}
name2[n]='\0';
printf("\n%s\n",name2);
}
#include<stdio.h>
#include<string.h>
void main()
{
char name1[50];
char name2[50];
char temp;
int i,j,n,k,s,m=-1;
printf("请输入你要调换单词顺序的字符串:\n");
fflush(stdin);
gets(name1);
n=strlen(name1);
for(i=0,j=n-1;i<n;i++,j--)
{
name2[i]=name1[j];
}
name2[n]=' ';
for(i=0;i<=n;i++)
{
if(name2[i]==' ')
{
k=m+1;
m=i;
for(s=0,j=k;s<(m-k)/2;s++,j++)
{
temp=name2[j];
name2[j]=name2[m-1-s];
name2[m-1-s]=temp;
}
}
}
name2[n]='\0';
printf("\n%s\n",name2);
}
#25
w 是来拜牛人的..
#26
好好利用用下那个空格就行了啊~~~~~~~~~~~~~~~用那个空格来判断,把空格转换成ASCII后判断,然后截取后在重新组装下就OK了~~~~~~~~~~~~~
#27
用指针移动最简单
#28
#include<stdio.h>
#include<string.h>
void main()
{
char str[11]={"I LOVE YOU"};
char st[11];
int i=0;
st[10]='\0';
char *p;
p=str;
for(i=0;i<3;i++)
st[i]=*(p+7+i);
st[3]=32;
for(i=0;i<4;i++)
st[i+4]=*(p+i+2);
st[8]=32;
st[9]=*p;
printf("%s\n",st);
}
#include<string.h>
void main()
{
char str[11]={"I LOVE YOU"};
char st[11];
int i=0;
st[10]='\0';
char *p;
p=str;
for(i=0;i<3;i++)
st[i]=*(p+7+i);
st[3]=32;
for(i=0;i<4;i++)
st[i+4]=*(p+i+2);
st[8]=32;
st[9]=*p;
printf("%s\n",st);
}
#29
http://community.csdn.net/Expert/topic/5232/5232012.xml?temp=.9141962
[超级大笨狼]提供三万单词库备份下载,MS-SQL 2000格式,下载请“自觉”捐赠可用分给我。
[超级大笨狼]提供三万单词库备份下载,MS-SQL 2000格式,下载请“自觉”捐赠可用分给我。