【问题标题】:fgets() Read New Line Char From Keyboardfgets() 从键盘读取换行符
【发布时间】:2017-06-24 02:40:25
【问题描述】:

我想知道fgets() 是否从用户输入(即键盘)读取新行字符。这是我写的一些示例代码:

while (1) {
  char userInput[3] = {'\0', '\0', '\0'};

  fgets(userInput, 3, stdin);
  flushStdin();
  printf("%s\n", userInput);
}

如果我输入'2',系统会再次提示我输入另一个字符,结果如下:

$ 2
$ 3
  2

$

我了解fgets() 的工作原理,因此可能是我的逻辑不正确。所需的输出是:

$ 2
  2

$

【问题讨论】:

  • $ 来自哪里?您的代码似乎比您显示的要多。请提供minimal reproducible example
  • 我不明白你的问题,fgets() 读取整行或3 字符,如果它们先插入。所以它枯萎了,一直读到'\n' 或者直到目标缓冲区中没有更多空间。
  • 什么是flushStdin()?您 cannot do that 没有调用未定义的行为(例如 fflush(stdin))或使用特定于平台的 API..
  • 试试printf("%d %d %d\n", userInput[0], userInput[1], userInput[2]);看看读了什么。

标签: c string char newline fgets


【解决方案1】:

我认为 fgets() 将比给定的缓冲区大小最多读取 1。当您按 Enter 时,它将从输入中获取 \n。您可以使用类似这样的东西来清理字符串的输入或使用 scanf() 进行 int 输入

void readLine(char* buffer, int bufferLength, FILE* file)
{
    fgets(buffer, bufferLength, file);

    int len = strlen(buffer);
    if(len > 0 && buffer[len - 1] == '\n'){
        buffer[len - 1] = '\0';
    }
}

【讨论】:

  • fgets 读取size_t 字节数(不是int),同样strlen 返回size_t清理输入有一种更简单的方法:buffer[strcspn(buffer, "\n")] = '\0';。请注意,这实际上阻碍了fgets 的处理机制之一;当'\n'找不到时,你需要记住你只是在处理一个部分行,然后想想下一个数据是什么 可能是……
  • @Seb char *fgets(char *str, int n, FILE *stream)int 用于n 字节,而不是size_t
猜你喜欢
  • 1970-01-01
  • 2017-02-11
  • 1970-01-01
  • 2015-07-06
  • 2020-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多