鱼C论坛

 找回密码
 立即注册
查看: 950|回复: 5

[已解决]有关自定义函数和嵌套

[复制链接]
发表于 2020-12-20 23:39:51 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#include<stdio.h>
void main()
{
        char str[80],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[i]!='\0';i++)
                   if(str[i]!=a)
                      str[j++]=str[i];
                //str[j]='\0';      
        }

请问上述代码中我注释掉的那一句是什么作用?我试了一下加还有不加,好像没区别啊
最佳答案
2020-12-20 23:44:01
本帖最后由 风过无痕1989 于 2020-12-21 09:38 编辑

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

使用道具 举报

发表于 2020-12-20 23:44:01 | 显示全部楼层    本楼为最佳答案   
本帖最后由 风过无痕1989 于 2020-12-21 09:38 编辑

1、在函数中查找到待删除字符后,后面的就会前移(即相当于删除动作),遍历完数组后,如果不添加 str[j]='\0',给查找完成的数组一个结束符,那么系统就会认定执行删除前的结束符,用 printf("%s",str) 输出,就等于是删除动作白做了;除非删除一个字符记录一个,然后用循环语句一个字符一个字符地单独输出
2、我运行了一下,事实证明,上面的结论是正确的:不注释掉时,能够删除需要删除的字符,注释掉以后,不能删除字符
做题.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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'

        
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-22 00:57:45 From FishC Mobile | 显示全部楼层
风过无痕1989 发表于 2020-12-20 23:44
1、在函数中查找到待删除字符后,后面的就会前移(即相当于删除动作),遍历完数组后,如果不添加 str[j]=' ...

你好,你发的两幅图的话,上面的那副应该是注释掉了的对吧,我仔细看了,确实倒数第二个那个z没有去掉,但是前面的那些z是去掉了的,请问这是咋回事呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-12-22 00:59:52 From FishC Mobile | 显示全部楼层
jackz007 发表于 2020-12-20 23:59
复制字符的代码肯定复制不到原始 str 字符串末尾的结束标志字符 '\0',如果 str 中有需要删除的字符  ...

嗯嗯,经过您和另一位的解答大概有些懂了,感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

其实也不是你注释掉了,那些删除真的无效了,删除动作是确实的动作,待删除的字符也删除了,只是因为所有动作都做完了,而没有结束标志,系统便将删除前的结束标志用来作为结束标志,于是 for 循环继续,将 str[ i ]后面的字符继续赋给 str[j++] ,从图中可以看到,删除了几个待删除的字符,它就补了几个到 str[j++](图中是删除了5个)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-12 10:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表