题目: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;
}


浙公网安备 33010602011771号