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被復制完后中還有字符。
