2015-12-21 139 views
3

我与GNU GCC Compiler.I代码块编辑器的编码写了下面的代码(包括相关的库和头文件)为什么发生运行时错误?

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并压在终端坏事发生了打印3的返回键again.Instead:运行时错误。 为什么会这样?这坏毛病没有我做?难道我忽略了一些范围规则?如果我这样做,我有没有忽略其范围规则?

+0

后什么是整个错误说前放置一个空格这个换行符? – immibis

+0

谢谢你对你所做的事情做得如此精确。 – fuz

回答

8

没有错的方案。你只需要跳过'\n'字符由以前scanf留下。
当你按下回车,那么多余的字符'\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'); 
+0

它们之间的区别是什么?你能解释更多吗? – Agent47

+0

@ Agent47; *“他们”*是什么意思? – haccks

+0

@haccks,你的意思是'ch =='\ n''对吗? –

3

变化scanf("%c",&a);scanf(" %c",&a);这是基本的规则从标准输入读取字符时从输入缓冲区跳过空间。

相关问题