题目:squeeze(s1, s2), 将字符串S1中任何与字符串S2中字符匹配的字符都删除。
虽然最后写出来了,用splint分析一下问题还不少,竟然有内存泄露问题,好歹函数的功能基本都实现了。写的程序问题有两个:一个是内存泄露,另一个是编译器警告squeeze函数返回地址与S1相同。要改进的地方很多,感觉今天最大的收获就是有点会用GDB调试程序了。题意理解错了,我理解为必须全部匹配才把S1中的字符串剔除掉,看英文的翻译意思很清楚。。。。
#include <stdio.h> #include <string.h> char *squeeze(char s1[], char s2[]); int main() { char *s1 = "saddddfafafadfafa"; char *s2 = "a"; char *snew = squeeze(s1, s2); printf("%s", snew); printf("\n"); return 0; } char* squeeze(char s1[], char s2[]) { char scut[strlen(s1)+1]; //copy the output array int i = 0, k = 0; int matchflag = 0; int s2len = strlen(s2); int j = 1; int samechar = 0; while(s1[i] != '\0'){ if(s1[i] != s2[0]){ scut[k] = s1[i]; //printf("%c\n",scut[k]); k++; i++; continue; } samechar++; i++; while(samechar <= s2len){ if((s1[i] == s2[j]) && (s1[i] != '\0')){ samechar++; j++; i++; continue; } else break;//要把部分相同的字母数倒退回来 } if(samechar == s2len){ matchflag = 1; } if(!matchflag){ i = i - samechar; samechar = 0; //相同字符每次后都要清0 j = 1; // j也要复位 scut[k] = s1[i]; //printf("%c\n",scut[k]); k++; i++; } else{ scut[k] = s1[i]; //printf("%c\n",scut[k]); k++; i++; samechar = 0; j = 1; } } scut[++k] = '\0'; return scut; }