C – fscanf in while循环跳过用户输入

所以我运行程序,它执行打印,从键盘读取我键入的字符,切换到适当的情况,但不是返回到循环的顶部并停止在fscanf以接收进一步的输入,它的行为就像它已经收到一个新的线或什么东西并切换到默认情况,再次返回到循环的顶部并期待输入。 我错过了什么?

这是代码:

#include  #include  #include  int main () { char *command; command = malloc (2); while (1) { printf ("Type help for usage\n"); printf ("Enter command: \n"); fscanf (stdin,"%c",command); switch (command[0]) { case 'a': printf ("a\n"); break; case 'h': printf ("help\n"); break; default: printf ("default\n"); } } return 0; } 

这是因为当你输入a ,你也输入一个换行符'\n' ,然后%c在第二次传递时获取换行符。

如果你分配char command[2]; 并使用scanf("%1s", command) ,你应该避免大多数问题。 %s转换说明符跳过前导空格, 1将输入限制为单个非空白字符,这应该可以帮助您充分利用。

就个人而言,我仍然使用:

  char line[4096]; while (fgets(line, sizeof(line), stdin) != 0) { char command[2]; if (sscanf(line, "%1s", command) == 1) ...got a command... else ...failed... } 

更喜欢这种情况的一个原因是它每次都会吃换行符,但更重要的是,如果出现问题,您可以在错误报告中使用整行信息。

  switch (command[0]) { case 'a': printf ("a\n"); fflush(stdin); break; case 'h': printf ("help\n"); fflush(stdin); break; default: printf ("default\n"); fflush(stdin); } } 

您还可以使用Fflush来克服此问题

如果用户输入多个命令,则在两个输入命令之间存在换行符。 你必须在你的fscanf通过在字符串格式" %c"的开头添加空格来捕获这个换行符将允许这样做

 fscanf (stdin," %c",command); 

您可以将command定义为char而不是指针:

  char command; 

如果你这样做, fscanf应改为

 fscanf (stdin,"%c",&command); switch (command) { 

您应该使用函数fflush(stdin);释放输入缓冲区fflush(stdin); 。 之后,您将能够进行下一个输入。