905853663 发表于 2020-12-20 23:39:51

有关自定义函数和嵌套

#include<stdio.h>
void main()
{
        char str,i,a;
        void han(char str[],char a);
        gets(str);
        printf("请输入要去除的字符:\n");
        scanf("%c",&a);
        han(str,a);
        printf("%s",str);
}
        void han(char str[],char a)
        {
                int i,j;
                for(i=j=0;str!='\0';i++)
                   if(str!=a)
                      str=str;
                //str='\0';      
        }

请问上述代码中我注释掉的那一句是什么作用?我试了一下加还有不加,好像没区别啊

风过无痕1989 发表于 2020-12-20 23:44:01

本帖最后由 风过无痕1989 于 2020-12-21 09:38 编辑

1、在函数中查找到待删除字符后,后面的就会前移(即相当于删除动作),遍历完数组后,如果不添加 str='\0',给查找完成的数组一个结束符,那么系统就会认定执行删除前的结束符,用 printf("%s",str) 输出,就等于是删除动作白做了;除非删除一个字符记录一个,然后用循环语句一个字符一个字符地单独输出
2、我运行了一下,事实证明,上面的结论是正确的:不注释掉时,能够删除需要删除的字符,注释掉以后,不能删除字符

jackz007 发表于 2020-12-20 23:59:14

本帖最后由 jackz007 于 2020-12-21 00:19 编辑

      复制字符的代码肯定复制不到原始 str 字符串末尾的结束标志字符 '\0',如果 str 中有需要删除的字符 a,那么,删掉以后,字符串的长度会减小,如果在循环结束后,不专门添加这个 '\0',那么,str 就会继续使用原来的结束标志字符,这样,虽然删除了字符,但是,字符串的长度却没有改变,其尾部自然会包含不该存在的垃圾字符。
      下面通过数据实际测试
       无注释
D:\00.Excise\C>x1
AAAAABBBBBCCCCCDDDDD
请输入要去除的字符:
A
BBBBBCCCCCDDDDD
D:\00.Excise\C>
      有注释
D:\00.Excise\C>x
AAAAABBBBBCCCCCDDDDD
请输入要去除的字符:
A
BBBBBCCCCCDDDDDDDDDD
D:\00.Excise\C>
      可见,无注释代码的测试结果符合预期,而有注释代码的运行结果明显错误,具体表现在,str 尾部会出现与被删除字符 'A' 数量相同的垃圾字符 'D'

      

905853663 发表于 2020-12-22 00:57:45

风过无痕1989 发表于 2020-12-20 23:44
1、在函数中查找到待删除字符后,后面的就会前移(即相当于删除动作),遍历完数组后,如果不添加 str=' ...

你好,你发的两幅图的话,上面的那副应该是注释掉了的对吧,我仔细看了,确实倒数第二个那个z没有去掉,但是前面的那些z是去掉了的,请问这是咋回事呢?

905853663 发表于 2020-12-22 00:59:52

jackz007 发表于 2020-12-20 23:59
复制字符的代码肯定复制不到原始 str 字符串末尾的结束标志字符 '\0',如果 str 中有需要删除的字符...

嗯嗯,经过您和另一位的解答大概有些懂了,感谢!

风过无痕1989 发表于 2020-12-22 02:02:23

905853663 发表于 2020-12-22 00:57
你好,你发的两幅图的话,上面的那副应该是注释掉了的对吧,我仔细看了,确实倒数第二个那个z没有去掉, ...

其实也不是你注释掉了,那些删除真的无效了,删除动作是确实的动作,待删除的字符也删除了,只是因为所有动作都做完了,而没有结束标志,系统便将删除前的结束标志用来作为结束标志,于是 for 循环继续,将 str[ i ]后面的字符继续赋给 str ,从图中可以看到,删除了几个待删除的字符,它就补了几个到 str(图中是删除了5个)
页: [1]
查看完整版本: 有关自定义函数和嵌套