《C程序设计语言》 练习2-4
问题描述
重新编写函数squeeze(s1,s2),将字符串s1中任何与字符串s2中字符匹配的字符都删除。
Write an alternate version of squeeze(s1,s2) that deletes each character in the string s1 that matches any character in the string s2 .
解题思路
这里有两种思路:
第一种就是将s1字符串的字符,一个一个的去和s2的全部字符对比,一旦发现有重复的,比如s1中的第5个字符与s2中的某个字符重复,我们就把s1中,从第六个字符(包括第六个)之后的全部字符往前移动一位,这样第五个字符就被覆盖了,如同被删除。
第二种也是要对比两个字符串,举个例子来解释这种方法,
例如s1中的第一个字符没有在s2中出现过,就将这个字符存到s1的第一个位置
再对比s1中第二个字符,如果这个字符在s2中也有,那么就不做任何操作
再对比s1中第三个字符,如果s2中没有这个字符,那么就将这个字符存进s1的第二个字符中
以此类推,最后给s1的最后一个位置存一个'\0'
其原理就是将不与s2重复的字符重新储存进s1中
方法一代码:
1 #include<stdio.h> 2 #define MAXLEN 1024 3 4 void squeeze(char s1[] , char s2[]); 5 void getlines(char array[], int maxlen); 6 7 int main() 8 { 9 char s1[MAXLEN],s2[MAXLEN]; 10 getlines(s1,MAXLEN); 11 getlines(s2,MAXLEN); 12 squeeze(s1,s2); 13 printf("%s",s1); 14 return 0; 15 } 16 17 void squeeze(char s1[] , char s2[]) 18 { 19 int i=0,j=0; 20 for ( i = 0; s1[i]!='\0'; i++) 21 { 22 for ( j=0; s2[j]!='\0'; j++) 23 { 24 if (s1[i]==s2[j]) 25 { 26 int k=i; 27 while (s1[k]!='\0') 28 { 29 s1[k]=s1[k+1]; 30 k++; 31 } 32 j=-1; 33 s1[k]='\0'; 34 } 35 } 36 } 37 } 38 void getlines(char array[], int maxlen) 39 { 40 int c,i; 41 for ( i = 0; i < maxlen-1 && (c=getchar())!=EOF&&c!='\n'; i++) 42 { 43 array[i] = c; 44 } 45 if (c=='\n') 46 { 47 array[i++] = c; 48 } 49 array[i] = '\0'; 50 }
方法二代码:
#include<stdio.h>
#define MAXLEN 100
void getlines(char array[],char maxlen)
{
int i,c;
for ( i = 0; i < maxlen-1 &&(c=getchar())!=EOF && c!='\n'; i++)
{
array[i] = c;
}
if (c=='\n')
{
array[i]=c;
i++;
}
array[i]='\0';
}
void squeeze(char s1[], char s2[])
{
int i, j, k;
for (i = k = 0; s1[i] != '\0'; i++)
{
for (j = 0; s2[j] != '\0' && s2[j] != s1[i]; j++)
{
;
}
if (s2[j] == '\0')
{
s1[k++] = s1[i];
}//如果s1的某个字符,与s2整个字符串都不相同,就会把s2遍历到最后,使s2[j] == '\0'
//就会执行上面这个if语句
//如果在遍历s2时,中间出现一个与s1相同的,for跳出,if不满足跳出,就什么都不执行,这个重复的值不执行拷贝,也就相当于被删除了
}
s1[k] = '\0';
}
int main()
{
char s1[MAXLEN];
char s2[MAXLEN];
getlines(s1,MAXLEN);
getlines(s2,MAXLEN);
squeeze(s1,s2);
printf("%s",s1);
return 0;
}
执行结果

欢迎大家关注我的微信公众号:农大CPU

浙公网安备 33010602011771号