为什么会出现运行时错误?

时间:2015-12-21 18:41:23

标签: c

我使用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发生了一些不好的事情:运行时错误。 为什么会这样?我犯了哪个错误?我是否忽略了一些范围规则?如果我做了,我忽略了哪个范围规则?

2 个答案:

答案 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读取字符时从输入缓冲区跳过空间的基本规则。