我编写了一个程序,它接受一个数字和一个分隔符。如果用户按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
是未定义的,但是你使用的处理器不太可能在这里出错,所以我忽略了它。