首页 > 编程语言 > 详细

《C程序设计语言》 练习2-4

时间:2020-05-10 17:21:57      阅读:42      评论:0      收藏:0      [点我收藏+]

问题描述

  重新编写函数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

 

  

《C程序设计语言》 练习2-4

原文:https://www.cnblogs.com/jerryleesir/p/12863551.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!