c - 来自 stdin 的 fgets 具有不可预测的输入大小

标签 c stdin fgets

我正在尝试从 stdin 读取一行,但我不知道如何正确处理输入大小至少等于限制的情况。示例代码:

void myfun() {
    char buf[5];
    char somethingElse;

    printf("\nInsert string (max 4 characters): ");
    fgets (buf, 5, stdin);

    ...

    printf("\nInsert char: ");
    somethingElse = getchar();
}

现在,用户可以做三件事:

  1. 输入少于 4 个字符(加上换行符):在这种情况下,stdin 中没有任何内容,随后的 getchar() 正确地等待用户输入;
  2. 恰好输入 4 个字符(加上换行符):在这种情况下,stdin 中留有一个换行符,随后的 getchar() 会读取它;
  3. 输入超过 4 个字符(加上换行符):在这种情况下,stdin 中至少还有一个字符,随后的 getchar() 会读取它,至少会留下换行符。

案例 23 需要使用 while(getchar() != '\n') 之类的东西清空 stdin ,而情况 1 不需要任何额外的操作。据我通过阅读类似问题的答案和 c-faq 了解到,没有标准/可移植的方法来了解实际情况是否是 1 中描述的情况。

我做的好吗?或者实际上一种可移植的方式来做到这一点?或者可能是一种完全不同的方法?

最佳答案

如果有空间,fgets 函数会将换行符存储在缓冲区中。因此,如果字符串中的最后一个字符不是换行符,您就知道需要刷新缓冲区。

fgets (buf, 5, stdin);
if (strrchr(buf, '\n') == NULL) {
    // flush buffer
    int c;
    while ((c = getchar()) != '\n') && (c != EOF));
}

关于c - 来自 stdin 的 fgets 具有不可预测的输入大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47718782/

相关文章:

c - 使用另一个函数中定义的变量

c++ - 控制键(左箭头)被发送到标准输入 (^[[D) 而不是被解释

C 在循环中将输入读入 char 数组

c - 用于 fgets 失败的最准确的 errno 值是什么?

Php 将 fopen 结果保存到一个字符串

c - 为什么 fgets() 在循环中被跳过?

c - 未在服务器端客户端-服务器 TCP 上接收单独的值

c - 如何获得有关 SIGFPE 信号的更多信息?

css - 不要让 gtk3 中的 css 与空地一起工作

multithreading - Win32 : ReadFileEx() on STD_IN_HANDLE blocks, 为什么?