在另一个字符串输入函数之后调用scanf()会创建幻像输入
这是一个小程序:
#include int main() { char str[21], choice[21]; int size; while(1){ printf("$ "); fgets(str, 20, stdin); printf("Entered string: %s", str); if(str[0] == 'q') { printf("You sure? (y/n) "); scanf("%s", choice); if(choice[0] == 'y' || choice[0] == 'Y') break; } } return 0; }
它使用fgets()
读取字符串。 如果字符串以q
开头,则确认用户是否要退出,如果用户键入y
,则退出。
当我运行它并键入q
,会发生这种情况:
$ q Entered string: q You sure? (y/n) n $ Entered string: $
注意$ Entered string:
。 显然, fgets()
得到一个空字符或其他东西作为输入,即使我没有输入任何东西。
这是怎么回事?
正如其他答案中所述, scanf
调用在输入缓冲区中留下换行符,你也可以在scanf之后使用getchar()
,如下所示:
scanf("%20s", choice);// always remember( & good) to include field width // in scanf while reading
否则它会在大字符串的情况下覆盖缓冲区
getchar(); //this will eat up the newline
此外,你还应该使用这样的fgets:
fgets(str,sizeof str, stdin); //Its better
这是因为scanf
调用会读取一个字符,但会将换行符保留在缓冲区中。 因此,当您下次调用fgets
会发现一个换行符并读取它,从而导致读取空行。
该解决方案看似简单:在scanf
调用中的格式之后放置一个空格:
scanf("%s ", choice); /* ^ */ /* | */ /* Note space */
这将导致scanf
读取并丢弃所有训练空白,包括换行符。
使用特定大小char choice [1]
的’char’ char choice [1]
要么
char c[1]; c = getchar(); if(c[0] == 'y' || c[1] == 'y'){ // DO SOMETHING }