【问题标题】:fgets seems to "get" \n even after getchar is usedfgets 似乎“得到” \n 即使在使用 getchar 之后
【发布时间】:2019-11-25 15:37:37
【问题描述】:

所以,我有了这段代码,然后继续将“名称”保存到二进制文件中。

scanf("%d", &option);
while(getchar() != '\n');

fgets(name,MAX_SIZE,stdin);

我认为 fgets 会保留那个 '\n',因为第一个单词保存在二进制文件的第 2 行,然后每个单词都保存在新行上。但是,当我在退出循环之前继续将其他内容保存到另一个二进制文件时,字符串会连续保存。

我如何摆脱那个'\n'?非常感谢。

【问题讨论】:

  • “二进制文件的第 2 行”不清楚。二进制文件通常不会被认为有 lines。你的意思是 text 文件吗?它的示例内容是什么?
  • fgets(name,MAX_SIZE,stdin);stdin 读取一个全新的行 - 包括换行符。它不保留之前从 stdin 读取的任何内容。
  • 没有足够的信息来完全回答您的问题,但请注意fgets() 确实会将尾随换行符复制到字符串中。因此,如果while(getchar() != '\n'); 不存在,则在scanf 之后立即调用fgets() 将返回一个仅包含换行符的字符串,如果您要写入文件,则有效地将“空行”插入文件.

标签: c scanf buffer fgets


【解决方案1】:

请注意,读取换行符的正确循环还需要考虑 EOF(输入的最后一行可能不以换行符结尾),所以应该是:

int c;
while ((c = getchar()) != EOF && c != '\n')
    ;

读取名称的代码应该是这样的,再次记住可能没有任何输入,所以fgets()可能表示EOF:

char name[MAX_SIZE];
if (fgets(name, sizeof(name), stdin) != NULL)
{
    name[strcspn(name, "\n")] = '\0';
    …write name to binary file…
}

name 的开头不会有换行符;如果用户只是点击 return 而不是输入名称,则可能没有任何name,但您可以很容易地检测到这一点。您可能还想删除前导和尾随空格,甚至可能对行内的空格进行规范化(确保一个或多个空格字符的所有序列都被一个空格替换)。

由于您没有展示如何将数据写入“二进制文件”,因此尚不清楚是否有人可以为您提供更多帮助。如果您添加了写入数据的代码,您将获得更有用的答案。例如,如果您使用 fprintf(fp, "\n%s\n", name),您会得到一个前导换行符,但您不太可能会问这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-07
    • 1970-01-01
    • 2020-11-24
    • 2011-04-27
    相关资源
    最近更新 更多