清理stdin缓冲区问题

时间:2016-09-23 20:27:01

标签: c

说我有以下代码

type ProcessInfo struct {
    PID string `json:"PID"`
    PPID string `json:"PPID"`
    PGID string `json:"PGID"`
    WINPID string    `json:"WINPID"`
    TTY   string `json:"TTY"`
    UID string `json:"UID"`
    STIME string `json:"STIME"`
    COMMAND string `json:"COMMAND"`
}

我在这里尝试测试的是当我输入4个以上的字符时清除缓冲区。只要我的名字是4个字符或更多,它就可以正常工作,但是当我达到3个字符或更少时,问题就变成了while循环。它期望来自stdin缓冲区的getchar(),但这是空的。有什么方法可以解决这个问题?

3 个答案:

答案 0 :(得分:1)

您需要检查name是否包含换行符。如果是,缓冲区中没有任何内容,您不需要刷新它。

    fgets(name, 5, stdin);
    printf("Name: %s\n", name);
    if (strchr(name, '\n') == NULL) {
        int c;
        while ((c = getchar()) != '\n' && c != EOF);
    }

答案 1 :(得分:1)

我们已经在Compatibility Documentation from SAP Development Tools的评论中对此进行了讨论。如果缓冲区中有空间,fgets()将使用终止换行符,将其放入缓冲区。您可以通过在缓冲区中查找换行符来确定它是否已完成此操作。如果你找到一个,那么

  1. 您可能希望删除它 - 例如将其替换为'\0'

  2. 您应该避免尝试排空输入行的尾部,因为流已经前进到下一行。

答案 2 :(得分:0)

  1. 检查fgets()的结果。除非代码这样做,否则使用name的内容可能是未定义的行为。避免使用幻数:使用sizeof name

            // fgets(name, 5, stdin);
            if (fgets(name, sizeof name, stdin) == NULL) Handle_EOF();
    
  2. '\n'中寻找潜力 name[]

            char *eol = strchr(name, '\n');
    
  3. 如果找到一个,则使用空字符覆盖,否则消耗该行的其余部分

            if (eol) {
              *eol = '\0';
            } else {
              int ch;
              while ((ch = getchar()) != '\n' && ch != EOF);
            }
    
  4. 打印name[]

            printf("Name: %s\n", name);