zoukankan      html  css  js  c++  java
  • 《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的最后一个位置存一个''

        其原理就是将不与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]!=''; i++)
    21     {
    22         for ( j=0; s2[j]!=''; j++)
    23         {
    24             if (s1[i]==s2[j])
    25             {
    26                 int k=i;
    27                 while (s1[k]!='')
    28                 {
    29                     s1[k]=s1[k+1];
    30                     k++;
    31                 }
    32                 j=-1;
    33                 s1[k]='';
    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!='
    '; i++)
    42     {
    43         array[i] = c;
    44     }
    45     if (c=='
    ')
    46     {
    47         array[i++] = c;
    48     }
    49     array[i] = '';
    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!='
    '; i++)
        {
            array[i] = c;
        }
        if (c=='
    ')
        {
            array[i]=c;
            i++;
        }
        array[i]='';
    }
    void squeeze(char s1[], char s2[])
    {
    	int i, j, k;
    
    	for (i = k = 0; s1[i] != ''; i++)
    	{
    		for (j = 0; s2[j] != '' && s2[j] != s1[i]; j++)
    		{
    			;
    		}
    		if (s2[j] == '')
    		{
    			s1[k++] = s1[i];
    		}//如果s1的某个字符,与s2整个字符串都不相同,就会把s2遍历到最后,使s2[j] == ''
            //就会执行上面这个if语句
            //如果在遍历s2时,中间出现一个与s1相同的,for跳出,if不满足跳出,就什么都不执行,这个重复的值不执行拷贝,也就相当于被删除了
    	}
    	s1[k] = '';
    }
    int main()
    {
        char s1[MAXLEN];
        char s2[MAXLEN];
    
        getlines(s1,MAXLEN);
        getlines(s2,MAXLEN);
    
        squeeze(s1,s2);
        printf("%s",s1);
        return 0;
    }
    

      

    执行结果

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

      

  • 相关阅读:
    英语初级学习系列-00-Name-介绍自己
    Solidworks实例学习
    数学——泰勒公式
    SolidWorks知识积累系列-01
    彻底弄懂HTTP缓存机制及原理
    基于 Pymsql 数据库连接池
    WEB框架之Flask
    Django使用消息提示简单的弹出个对话框
    代码的调试、运行
    微信公众号本地测试环境搭建(附带内网穿透工具使用)
  • 原文地址:https://www.cnblogs.com/jerryleesir/p/12863551.html
Copyright © 2011-2022 走看看