练习2-4 重新编写函数squeeze(s1,s2),将字符串s1中任何与字符串s2中字符匹配的字符都删除。

原创 2016年08月31日 16:50:05

练习2-4 重新编写函数squeeze(s1,s2),将字符串s1中任何与字符串s2中字符匹配的字符都删除。


参考代码:

#include<stdio.h>
#include<string.h>

//void squeeze(char s1[], char s2[])
//{
//    int i = 0;
//    int j = 0;
//    int n = 0;
//    int t;  //表示s1与s2的元素是否相同,1为相同,0为不同
//    while(s1[i] != '\0')
//    {
//        t = 0;
//        j = 0;
//        while(s2[j] != '\0')
//        {
//            if(s1[i] == s2[j])
//                t = 1;
//            j++;
//        }
//        if(t == 0)
//            s1[n++] = s1[i];
//        i++;
//    }
//    s1[n] = '\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[k] = '\0';
}
int main()
{
    char s1[] = "abgghcbd";
    char s2[] = "bcd";
    squeeze(s1,s2);
    printf("%s", s1);
    return 0;
}

在参考代码中,被注释掉的部分是我自己编写的sequeeze函数,下边的是答案给出的函数,之所以将我自己写的代码注释掉,是因为我觉得答案给出的for循环更加紧凑,for循环更加适合初始化和增加步长都是单条语句且逻辑相关的情形,将循环控制语句都集中放在了一起,因此显得更加紧凑。

具体来说,两个sequeeze函数的思想基本是一样的:在遍历s1的过程中,寻找s2中是否有和s1相同的元素。在我自己写的函数中,设置了变量t来标记是否出现过相同的元素,循环一直到s2的结尾,如果遇到了和s1相同的元素则设置为1,;而在答案给出的函数中,在循环控制的条件中,如果遇到相同元素或者遍历到s2的结尾,则停止循环,如果最后s2遍历到了结尾\0的位置,则表示没有遇到相同的元素;循环结束以后,两个函数的处理是一样的,在我自己写的函数中,如果t为0,则将当前s1[i]覆盖到s1[n]的位置上,然后n++;答案给出的函数中,如果遍历到了结尾,则将s1[i]覆盖到s1[k]的位置上,然后k++;用这种覆盖的方式将和s2中重复的元素删除掉。

解释完过程以后,可以说一下,之所以保留答案给出的函数,最重要的一点就是答案给出的函数执行效率更高,因为在内嵌的循环中,我自己写的函数每次都需要遍历到s2的结尾,而答案的效率提高在于它不需要每次到遍历到s2的结尾,当遇到重复元素时,循环就会停止。因此,相比来说,答案的思路更加值得借鉴。当然,也可以在我的循环中加上t==1这个结束条件,只不过为了对比明显,发现自己的问题,就不作更改了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

练习2-4 重新编写函数squeeze(s1,s2),将字符串s1中任何与字符串s2中匹配的字符都删除

调试前程序#include void squeeze(char s1[],char s2[]);main() { int i; char s1[10]; char s2[3]...
  • Civil_CHOW
  • Civil_CHOW
  • 2016年06月05日 18:09
  • 664

编一个程序,将两个字符串s1和s2比较,返回差值,即实现strcmp函数功能

编一个程序,将两个字符串s1和s2比较,返回差值;即编一个程序,即实现strcmp函数功能...
  • wtdm_160604
  • wtdm_160604
  • 2017年04月23日 22:06
  • 1548

练习2-5 编写函数any(s1,s2),将字符串s2中的任一字符在字符串s1中第一次出现的位置作为结果返回。如果s1中不包含s2的字符,则返回-1。

练习2-5 编写函数any(s1,s2),将字符串s2中的任一字符在字符串s1中第一次出现的位置作为结果返回。如果s1中不包含s2的字符,则返回-1。 #include int any(char...
  • taolusi
  • taolusi
  • 2016年08月31日 23:31
  • 2121

编写函数squeeze(s1,s2),将字符串s1中任何与字符串s2中字符匹配的字符都删除

//C程序设计语言(第2版)P38void squeeze(char s1[], char s2[]){ int i, j, k; for (i = k = 0; s1[i] != /0; i++) ...
  • wenwei0902
  • wenwei0902
  • 2010年05月09日 20:43
  • 353

C程序设计语言第二版练习2-4(squeeze(s1,s2),s1中删除与s2相同的字符并输出)

#include #include  char a[100],b[100];  int len;  int squeeze(char* s1, const char* s2) ...
  • u010075097
  • u010075097
  • 2014年08月07日 15:58
  • 473

C语言_删除字符函数

编写一个函数del().用于从给定字符串中删除一部分。传输三个参数,一个待删除字符串,一个删除起始位置(从0开始),一个删除长度. 分析:        已经知道数组(sum),删除位置(del)...
  • u012745229
  • u012745229
  • 2015年12月02日 13:15
  • 2143

删除一个字符串的一部分

《C和指针》第6章编程练习: 请编写一个函数,删除一个字符串的一部分,函数的原型如下: int del_substr(char *str,char const *substr ) 函数首先应该判断s...
  • yff1030
  • yff1030
  • 2012年07月17日 19:35
  • 4411

MATLAB中squeeze函数的作用

squeeze:  除去size为1的维度 B = squeeze(A) 描述: B = squeeze(A),B与A有相同元素,但所有只有一行或一列的维度(a singleton dimension...
  • what_lei
  • what_lei
  • 2015年09月25日 10:20
  • 4993

vim中选择匹配文本删除技巧

试举几例如下: 1. 如何只保留匹配内容行而删除其他行? :v/pattern/d :help :v 2. 如何对每行只保留匹配内容而删除这一行中的其它内容 :%s/^.*\...
  • jiedushi
  • jiedushi
  • 2011年11月22日 15:17
  • 9656

练习2-4 重新编写函数squeeze(s1,s2),将字符串s1中任何与字符串s2中字符匹配的字符都删除。

练习2-4 重新编写函数squeeze(s1,s2),将字符串s1中任何与字符串s2中字符匹配的字符都删除。 参考代码: #include #include //void squeeze(char ...
  • taolusi
  • taolusi
  • 2016年08月31日 16:50
  • 1219
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:练习2-4 重新编写函数squeeze(s1,s2),将字符串s1中任何与字符串s2中字符匹配的字符都删除。
举报原因:
原因补充:

(最多只允许输入30个字)