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

时间:2013-04-03 17:19:24

标签: c while-loop scanf

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

以下是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

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;
}

4 个答案:

答案 0 :(得分:4)

这是因为当您输入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...
 }

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

答案 1 :(得分:0)

如果用户输入多个命令,则两个输入命令之间有换行符。并且你必须在fscanf中通过在字符串格式" %c"的开头添加空格来抓住这个换行符

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

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

 char command;

如果您这样做,fscanf应更改为

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

switch (command) {

答案 2 :(得分:0)

    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来解决此问题

答案 3 :(得分:0)

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