我使用GNU GCC Compiler编写代码块编辑器。我编写了以下代码(包括相关的库和Header文件)
int main()
{
char a;
scanf("%c",&a);
switch(a)
{
case '1':
scanf("%c",&a);
if(a=='3')
{
printf("3\n");
}else
{
printf("4\n");
}
break;
case '2':
printf("HELLO\n");
break;
}
return 0;
}
当我运行代码时,终端显示光标以获取字符。我输入1
并按下返回键。所以它要我输入另一个字符。这次我输入{{1}并再次按下返回键。而不是在终端打印3
发生了一些不好的事情:运行时错误。
为什么会这样?我犯了哪个错误?我是否忽略了一些范围规则?如果我做了,我忽略了哪个范围规则?
答案 0 :(得分:8)
该计划没有错。您只需要跳过之前'\n'
留下的scanf
字符
按 Enter 时,额外的字符'\n'
将进入输入缓冲区。当前'\n'
遗留了此scanf
。在下一次阅读scanf
将读取此剩余字符,您将得到该程序的意外行为。
要跳过此换行符,您可以在%c
scanf(" %c",&a);
// ^^ A space before %c can eat up any number of white spaces.
Another way是在每个scanf
int ch;
while((ch = getchar()) != EOF && ch != '\n');
答案 1 :(得分:3)
将scanf("%c",&a);
更改为scanf(" %c",&a);
这是从stdin读取字符时从输入缓冲区跳过空间的基本规则。