c:翻转一个长句中的每个单词

问题:

输入:“how are    you     baby--   "

输出:”woh era    uoy     --ybab   "

#include<stdio.h>
#include<string.h>
#define SWAP(a,b) (a)^=(b);(b)^=(a);(a)^=(b) char* sentenceReverse(char* input){
if(NULL == input) return;
char *r,*f;
char *inp = (char*)malloc(sizeof(char)*(strlen(input)+));
//当input是const时其内容不能修改,此时需要在堆上new一个新数组;
strcpy(inp,input);
r=f=inp;
printf("input is:%s-----\n",inp);
char *rear,*front;//用于标记一个单词的词首和词尾
while(*r){
while(*r==' ') r++;
f=r;
while(*r!=' ' && *r!='\0') r++;
r--;
front=f;rear=r;
while(rear > front){//翻转一个单词
SWAP(*rear,*front);
front++;
rear--;
}
if(*(++r)=='\0') break;
}
return inp;
} int main(){
char test1[]="1oow lsije ";
char *test2="sdklf ";
char *ret2;
printf("test1 result is:%s-----\n",ret2=sentenceReverse(test1));
printf("test2 result is:%s-----\n",sentenceReverse(test2));
free(ret2);//free掉malloc开辟的空间
return ;
}

输出结果:

xu@xu-ThinkPad-X61:~/algorithm$ gcc sentenceReverse.c
xu@xu-ThinkPad-X61:~/algorithm$ ./a.out
input is:1oow lsije -----
test1 result is:woo1 ejisl -----
input is:sdklf -----
test2 result is:flkds -----

总结:

一,当函数参数是test2时(注意它声明时是char * 类型),内存做了以下操作:1.在堆上保存test2指针。2.将其内容:"sdklf "保存在“常量区”(具体我也不清楚,反正该区域内容不能修改)。找到下面连接,问题解释的比较清晰:

http://blog.chinaunix.net/uid-26456800-id-3262510.html

二,当函数sentenceReverse()对数组char *test2内容修改时,总会报错“

段错误 (核心已转储)”。

三,解决方案:在堆上重新开辟新空间进行操作。如上函数中新建数组inp[ ];

四,当函数参数是test1时(注意是它声明时是char [ ]类型)就不存在内存“段错误”问题。其内容存储在堆上可以直接修改。

深藏功与名!

上一篇:vue 脚手架 立即可以写业务 vue + vue-router + less + axios + elementUI + moment


下一篇:Webpact打包React后端Node+Express