c语言 - 不使用系统( "PAUSE" ) 终止我的程序



我编写了一个程序,它接受一个数字和一个分隔符。如果用户按enter键,则程序将打印数字的总和。

输入示例:2[space]3[enter]将打印&;total = 5&;, 1[space]2[space]3[enter]将打印&;total = 6&;,但如果我输入2a3[enter],程序将被终止并退出,而不是打印&;error!&;并按"ENTER"键…消息。之前,我使用system("PAUSE")函数,没有问题(出现错误信息)。然后我知道它不是标准的,所以我用2行代码替换它(你可以在代码中看到),问题发生了。

我输入:

2(空间)3(输入)——比;Print "total = 5">

2 a3(输入)——比;程序被终止,而不是打印&;error!&;并按"ENTER"键…消息

#include <stdio.h>
#include <stdlib.h>
int main()
{
int num, total;
char separator;
for(;;)
{
scanf("%d%c", &num, &separator);
total += num;
if(separator == 'n')
{
printf("total = %dn", total);
break;
}
else if(separator == ' ')
{
//do nothing
}
else
{
printf("error!n");
break;
}
}
printf("press ENTER to exit..."); //this
getchar(); //two lines
//previously, I use system("PAUSE"), and there is no problem.
return 0;
}

我使用gcc 10.3.0和Windows 10操作系统。

谁能给我解释一下为什么会出现这个问题?

输入缓冲区fun.

当您在printf("error!")之后点击break;语句时,会出现一个"3n"在输入缓冲区中;因此,getchar()找到立即读取的内容,因此您的程序似乎立即终止。在错误之后缺少换行符会导致在Windows上该行被乱码,因为命令提示符会先将光标向左移动,而不是在命令提示符的中间行开始。

不建议使用scanf来解析键盘输入,而是使用fgets()getline()来解析自己,以避免像这样的输入缓冲区。

像这样使用total是未定义的,但是你使用的处理器不太可能在这里出错,所以我忽略了它。

最新更新