the c programming language——squeeze函数(2-4)

时间:2020-11-30 21:31:31

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

 

 

 

 

the c programming language——squeeze函数(2-4)