练习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这个结束条件,只不过为了对比明显,发现自己的问题,就不作更改了。

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

相关文章推荐

将字符串S1中任何与字符串S2中匹配的字符都删除,实现函数squeeze(s1,s2).

/* test driver */#include #include #include void squeeze2(char s1[], char s2[]); //定义buffer的原因是想输出...

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

调试前程序#include void squeeze(char s1[],char s2[]);main() { int i; char s1[10]; char s2[3]...

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

#include int any(char s1[],char s2[]);main() { int i; char s1[10]; char s2[3]; for(...

练习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
  • 1495

c语言一起学习之建立头文件(二)

一、接上文建立头文件方式,本项目讲解引用自定义头文件方式,以及static和extern限制方法的作用。 接上文,建立项目,建立头文件print.h。 #include #include "p...

C 语言项目中.h文件和.c文件的关系

http://blog.csdn.net/liangwei88624/article/details/6284661   在编译器只认识.c(.cpp))文件,而不知道.h是何物的年...

1.实现一个函数,可以左旋字符串中的k个字符。 AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA 2.判断一个字符串是否为另外一个字符串旋转之后的字符串。 例如:给定s1

1.实现一个函数,可以左旋字符串中的k个字符。 AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA 将一个字符串左旋k个,首先想到将一个字符串左旋一个,然后把得到的这个新字符...

练习2-3 编写函数 htoi(s),把由十六进制数字组成的字符串(包含可选的前缀0x 或0X)转换为与之等价的整型值。字符串中允许包含的数字包括:0~9、a~f以及A~F。

C语言程序设计(第二版) 练习2-3 个人设计练习2-3 编写函数 htoi(s),把由十六进制数字组成的字符串(包含可选的前缀0x或0X)转换为与之等价的整型值。字符串中允许包含的数字包括:0~...

练习1-19 编写函数 reverse(s),将字符串s 中的字符顺序颠倒过来。使用该函数编写一个程序,每次颠倒一个输入行中的字符顺序。

练习1-19 编写函数 reverse(s),将字符串s 中的字符顺序颠倒过来。使用该函数编写一个程序,每次颠倒一个输入行中的字符顺序。自己的:思路最开始的思路是在函数里新建一个字符数组,将输入...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:练习2-4 重新编写函数squeeze(s1,s2),将字符串s1中任何与字符串s2中字符匹配的字符都删除。
举报原因:
原因补充:

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