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 }
寫這個函數的時候思路卻是很清晰,可是寫完以後遇到了一堆問題c++
1.最初我是直接return t;可是返回主程序後printf時出現亂碼,後面查詢資料後得知是關於堆棧,函數中的變量一旦出了函數體,就會被釋放,函數
此時輸出該變量的地址就會是亂七八糟的東西,目前我能想到的解決方法就是用s將t帶回;spa
2.在PTA中char *t[2*len+1]={'\0'};編譯不能經過,但在devc++中又能經過,若是不初始化t,就會致使s複製t時多複製出一些不該該出現的東西,因而我用了最原始的while循環;code
3.s[i]='\0';很容易被忽略,這是防止t的字符串長度短於s原始的長度,以致於t被複制完後中還有字符。blog