我正在使用GNU GCC Compiler编写代码块编辑器.我编写了以下代码(包括相关的库和头文件)
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
字符.我输入3
并按下返回键.所以它要我输入另一个字符.这次我输入并再次按下返回键.而不是打印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');