《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

 

  

posted @ 2020-05-10 15:52  骑码的佳俊  阅读(445)  评论(2编辑  收藏  举报