字符串“键入字符”在条件失败后重复两次(如果) a [0]!='q'。我需要知道它为什么会发生,我该如何解决呢!
#include <stdio.h>
int main(void){
char a[1]="";
here:
puts("type a character");
scanf("%c",&a[0]);
if(a[0] != 'q'){
puts("try again");
goto here;
}
if(a[0] == 'q') {
puts("successful");
}
return 0;
}
答案 0 :(得分:4)
scanf("%c", ...)
将读取输入中的任何字符,包括换行符。因此,如果您按a<enter>b<enter>
,则第一个scanf
将获得'a'
,第二个将获得换行符,第三个将获得'b'
。
在你的情况下,第二次调用scanf
时,它将立即返回一个换行符,然后这将导致循环执行第三次。
解决此问题的一种方法是在%c
:scanf(" %c", ...)
之前添加空格。这将导致scanf
在读取字符之前跳过所有空格(包括换行符)。
答案 1 :(得分:1)
scanf("%c");
从ENTER
键读取换行符。当您键入字符a
时,也会键入a
,然后键入ENTER
键。现在输入缓冲区中有两个字符。由于换行符仍然在输入缓冲区中,因此您将获得两次字符串type a character
。
建议不要使用scanf,原因在这里说明Why does everyone say not to use scanf? What should I use instead?。
或者你可以使用,
while((c = getchar()) != '\n' && c != EOF)
阅读角色&amp;摆脱换行。