《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