码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2020-05-10 17:03:44      阅读:69      评论:0      收藏:0      [点我收藏+]

标签:cpp   bsp   mat   解释   highlight   hat   就是   编写   包括   

问题描述

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

标签:cpp   bsp   mat   解释   highlight   hat   就是   编写   包括   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!