请指教一下,下面这个代码我想得出如:输入"thios"回车,再输入"o",回车得出"this",但是
请指教一下,下面这个代码我想得出如:输入"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
先吐槽:发代码时一定要用网页中的格式化工具格式化一下,不然这么乱一坨很少有人愿意看的...错误点在 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)。