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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM