1

所以我运行程序,它进行打印,读取我从键盘输入的字符,切换到适当的情况,但不是返回循环顶部并在 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

4 回答 4

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

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

于 2013-04-03T17:21:53.157 回答
0

如果用户输入许多命令,那么在 2 个输入命令之间会有一个换行符。你必须fscanf通过在字符串格式的开头添加空格来捕捉这个换行符" %c"才能做到这一点

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

您可以将commandaschar和 not 定义为指针:

 char command;

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

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

switch (command) {
于 2013-04-03T17:28:14.027 回答
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 来解决这个问题

于 2013-04-03T17:32:34.250 回答
0

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

于 2013-04-03T18:42:59.680 回答