在另一个字符串输入函数之后调用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 }