我正在使用GNU GCC编译器在代码块编辑器中进行编码。我编写了以下代码(包括相关的库和头文件)
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;
}
当我运行的代码,终端显示的光标以获得character.I类型1
和压回key.So它想让我进入另一个character.This时间我输入3
并按下回车键again.Instead打印的3
在终端发生了一些不好的事情:运行时错误。为什么会发生这种情况?我犯了哪个严重错误?我是否忽略了某些合并范围规则?如果我这样做了,我忽略了哪个合并范围规则?
该程序没有错。您只需要跳过上一个'\n'
字符留下的字符scanf
。
当您按时Enter,一个额外的字符'\n'
将进入输入缓冲区。这'\n'
是当前的遗留问题scanf
。下次读取时,scanf
将读取此剩余字符,您将获得程序的意外行为。
要跳过此换行符,可以在前面放置一个空格 %c
scanf(" %c",&a);
// ^^ A space before %c can eat up any number of white spaces.
另一种方法是在每行之后scanf
int ch;
while((ch = getchar()) != EOF && ch != '\n');
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句