Ç - 的fscanf在while循环跳过用户输入(C - fscanf in while loop

2019-10-17 22:59发布

于是我运行程序,它的打印,读取我从键盘输入字符,切换到适当的情况下,而不是返回到循环的顶部和的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;
}

Answer 1:

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

对于喜欢这样做的一个原因是,它吃换行符每一次,但更重要的是,如果出现错误,你有信息的整条生产线中的错误报告使用。



Answer 2:

    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从这个问题要克服



Answer 3:

如果用户输入命令许多所以有2级输入的命令之间的换行符。 你必须抓住这个换行符在你fscanf通过在字符串格式的开头添加空间" %c"将允许这样做

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

您可以定义commandchar ,而不是为指针:

 char command;

如果你这样做,在fscanf应改为

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

switch (command) {


Answer 4:

你应该使用函数释放你的输入缓冲区fflush(stdin); 。 在这之后,你将能够采取的下一个输入。



文章来源: C - fscanf in while loop skips user input