1

这是一个小程序:

#include <stdio.h>

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()。如果字符串以 a 开头q,则确认用户是否要退出,如果用户键入 则退出y

当我运行它并键入q时,会发生这种情况:

$ q
Entered string: q
You sure? (y/n) n
$ Entered string: 
$ 

注意$ Entered string:. 显然,fgets()即使我没有输入任何内容,也输入了一个空字符或其他内容。

这是怎么回事?

4

3 回答 3

2

如其他应答scanf呼叫中所述,将换行符留在输入缓冲区中,您也可以getchar()在 scanf 之后使用,如下所示:

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 
于 2013-07-12T12:36:42.383 回答
2

这是因为scanf调用读取了一个字符,但将换行符留在了缓冲区中。因此,当您下次调用时,fgets会发现一个换行符并读取它,从而导致读取一个空行。

scanf解决方案看似简单:在调用中的格式后放置一个空格:

scanf("%s ", choice);
/*       ^    */
/*       |    */
/* Note space */

这将导致scanf读取并丢弃所有训练空格,包括换行符。

于 2013-07-12T12:20:59.260 回答
0

使用特定大小的“字符”char choice [1]

或者

char c[1];
c = getchar();
if(c[0] == 'y' || c[1] == 'y'){
 // DO SOMETHING
}
于 2016-05-20T18:42:55.690 回答