函数match应打印s中从ch1到ch2之间的所有字符,并且返回ch1的地址。


1
char *match( char *s, char ch1, char ch2 ){ 2 int len=0; 3 int m=0; 4 int i=0; 5 while(s[len]){ 6 len++; 7 } 8 9 char t[2*len+1];//防止s字符串全满导致t溢出 10 while(i<(2*len+1)){ 11 t[i]='\0'; 12 i++; 13 }//初始化 14 i=0; 15 while(s[i]!=ch1&&s[i]){ 16 i++; 17 }//寻找ch1在s中的位置 18 int k=i; 19 if(i<len){ 20 do{ 21 t[m]=s[i]; 22 m++; 23 i++; 24 }while(s[i]!=ch2&&s[i]);//将从ch1开始的字符存入t中 25 if(i<len){ 26 t[m]=s[i]; 27 m++; 28 }//若是存在ch2,将ch2存入t中 29 t[m]='\n'; 30 while(s[k]){ 31 m++; 32 t[m]=s[k]; 33 k++; 34 }//存入s中ch1的地址 35 36 }else 37 { 38 t[0]='\n'; 39 }

//至此t的字符串已经完善
40 i=0; 41 while(t[i]){ 42 s[i]=t[i]; 43 i++; 44 }//将s替换为t 45 s[i]='\0';//防止t<s 46 47 return s; 48 }

写这个函数的时候思路倒是很清晰,但是写完之后遇到了一堆问题

1.最初我是直接return t;但是返回主程序后printf时出现乱码,后面查询资料后得知是关于堆栈,函数中的变量一旦出了函数体,就会被释放,

   此时输出该变量的地址就会是乱七八糟的东西,目前我能想到的解决方法就是用s将t带回;

2.在PTA中char *t[2*len+1]={'\0'};编译不能通过,但在devc++中又能通过,如果不初始化t,就会导致s复制t时多复制出一些不应该出现的东西,于是我用了最原始的while循环;

3.s[i]='\0';很容易被忽略,这是防止t的字符串长度短于s原始的长度,以至于t被复制完后中还有字符。

posted @ 2020-02-16 10:18  陈十  阅读(715)  评论(0编辑  收藏  举报