为了账号安全,请及时绑定邮箱和手机立即绑定

请指教一下,下面这个代码我想得出如:输入"thios"回车,再输入"o",回车得出"this",但是

请指教一下,下面这个代码我想得出如:输入"thios"回车,再输入"o",回车得出"this",但是

C C++
什么鬼_呀你 2017-05-10 07:14:51
请指教一下,下面这个代码我想得出如:输入"thios"回车,再输入"o",回车得出"this",但是不知道哪里出问题了? #include"stdio.h" main() { extern enter_string(),delete_string(),print_string(); static char str[80]; char c; enter_string(str); scanf("%c",&c); delete_string(str,c); print_string(str); } extern enter_string(str) char str[80]; { gets(str); } extern delete_string(str,ch) char str[],ch; { int i,j; for(i=j=0;str[i]!='\0';i++) if(str[i]!=ch) str[j++]=str[i]; str[i]='\0'; } extern print_string(str) char str[]; { printf("%s",str); }
查看完整描述

3 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

先吐槽:发代码时一定要用网页中的格式化工具格式化一下,不然这么乱一坨很少有人愿意看的...


错误点在 delete_string() 函数中最后的 str[i]='\0';,应该是 str[j]='\0';

因为 i 表示的是原字符串的结尾,在 for 循环退出时 i 所指的就是原字符串结尾的 \0,而 j 才是指向改写后的字符串结尾,所以应该在 j 位置上写入 \0。

否则你那样写的话,等于原字符串结尾位置没有变。所以即便 s 覆盖了前面的 o,最后还会按照原字符串的长度输出 thiss,没错吧?


再次吐槽:

这个代码看着真有沧桑感啊!  代码风格比 C89 K&R 还老…… 你到底看的是哪个年代的教程啊?!

现在学习C/C++语言最好按照新标准来学,太老的代码除了“经典”外还包含了很多现在视为错误和不推荐的写法,已经不适合用来学习了!

  • 你这样的 main 函数应该声明为 int main(void),不要省略前面的 int 及括号中的 void(这是在你不使用main参数的情况下)

    其实函数声明时缺少返回类型,编译器会隐式认为其返回类型是 int,这是在老标准中常用的,现在不推荐这样写了。

  • 声明/定义函数时参数名和参数类型都要写在参数列表的括号中。你这样将参数类型写在函数体前、函数名后的风格比 C89 还要老……

    定义函数时同样不要忘记明确写上返回类型,而且不用在函数定义前写 extern。

    其实你可以把这几个函数定义在 main 函数之前,这样也就不用前置声明它们了(即便是前置声明也没必要写extern)。

查看完整回答
反对 回复 2017-05-10
  • 什么鬼_呀你
    什么鬼_呀你
    呃,谢谢,自学的,ರ_ರ ...心塞!跟不上时代
  • onemoo
    onemoo
    没关系。如果你真想学C语言,我推荐你看些更现代些的教程。这里太挤了,我另写一个回答吧。
  • 什么鬼_呀你
    什么鬼_呀你
    虽然才看见,但是谢谢了!
  • 3 回答
  • 1 关注
  • 1735 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信