有关自定义函数和嵌套
#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-21 09:38 编辑
1、在函数中查找到待删除字符后,后面的就会前移(即相当于删除动作),遍历完数组后,如果不添加 str='\0',给查找完成的数组一个结束符,那么系统就会认定执行删除前的结束符,用 printf("%s",str) 输出,就等于是删除动作白做了;除非删除一个字符记录一个,然后用循环语句一个字符一个字符地单独输出
2、我运行了一下,事实证明,上面的结论是正确的:不注释掉时,能够删除需要删除的字符,注释掉以后,不能删除字符 本帖最后由 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'
风过无痕1989 发表于 2020-12-20 23:44
1、在函数中查找到待删除字符后,后面的就会前移(即相当于删除动作),遍历完数组后,如果不添加 str=' ...
你好,你发的两幅图的话,上面的那副应该是注释掉了的对吧,我仔细看了,确实倒数第二个那个z没有去掉,但是前面的那些z是去掉了的,请问这是咋回事呢? jackz007 发表于 2020-12-20 23:59
复制字符的代码肯定复制不到原始 str 字符串末尾的结束标志字符 '\0',如果 str 中有需要删除的字符...
嗯嗯,经过您和另一位的解答大概有些懂了,感谢! 905853663 发表于 2020-12-22 00:57
你好,你发的两幅图的话,上面的那副应该是注释掉了的对吧,我仔细看了,确实倒数第二个那个z没有去掉, ...
其实也不是你注释掉了,那些删除真的无效了,删除动作是确实的动作,待删除的字符也删除了,只是因为所有动作都做完了,而没有结束标志,系统便将删除前的结束标志用来作为结束标志,于是 for 循环继续,将 str[ i ]后面的字符继续赋给 str ,从图中可以看到,删除了几个待删除的字符,它就补了几个到 str(图中是删除了5个)
页:
[1]