【问题标题】:Alternate method for clearing input buffer in c在c中清除输入缓冲区的替代方法
【发布时间】:2014-12-03 13:44:58
【问题描述】:

有没有其他方法可以在不使用

的情况下清除 c 中的输入缓冲区
  fflush();

  while(getchar()!='\n');

因为我到处都读过它,找不到任何其他方法。

【问题讨论】:

  • while (scanf("%c",&c) == 1) 怎么样?
  • @barakmanos 对不起,先生,但您的意思不是 while (scanf("%c",&c) == 1);
  • rewind(stdin);fseek(stdin,0,SEEK_END); 可能会工作,虽然我没有测试过......
  • 除此之外您还需要其他东西的用例是什么?

标签: c


【解决方案1】:

最好的解决方案是不要过多地依赖输入缓冲区的状态。

使用fgets() 将输入读取为整行,然后解析它们。不要使用例如scanf() 读取单个值,因为它以令人讨厌的方式与缓冲区交互。

【讨论】:

  • 但我在谈论这种情况,例如,当使用 getchar() 时,某些“/n”或其他未读取的字符会干扰功能。使用 fgets() 或 getline() 是另一个问题,谢谢回复虽然。
【解决方案2】:

使用fgets() 作为建议者@unwind 最佳方法。

刷新到行尾。

void FlushStdin(void) {
  int ch;
  while(((ch = getchar()) !='\n') && (ch != EOF));
}

如果stdin 已准备好刷新到行尾,则调用FlushStdin() 或其他已发布的scanf()fgetc() 解决方案将刷新到下一个的末尾行。

如果下一个char'\n',请注意scanf("%*[^\n]%*1[\n]"); 不会工作。

【讨论】:

    【解决方案3】:

    另一种清除输入缓冲区(stdin)的方法是使用

    scanf("%*[^\n]%*1[\n]");
    

    这里,%*[^\n] 指示 scanf 扫描所有内容,直到找到换行符 (\n) 然后丢弃它。%1*[\n] 告诉 scanf 扫描 1 个字符,包括 \n字符并将其也丢弃。

    【讨论】:

    • flushstdin.c:9:5: warning: unknown conversion type character ‘*’ in format [-Wformat=]
    • “这里,%*[^\n] 指示 scanf 扫描所有内容,直到找到换行符 (\n),然后将其丢弃。”如果第一个 char'\n',则不正确。 '\n' 仍保留在 stdin 中。
    • @DavidC.Rankin,谢谢。修复它
    • 使用%*c 代替%*1[\n] 不能解决输入仅为'\n' 的问题,因为未达到格式说明符的第二部分。而是代码代码代码使用 2 个独立的 scanf() 调用:scanf("%*[^\n]"); scanf("%*1[\n]");scanf("%*[^\n]"); getchar();
    • @chux ,scanf("%*[^\n]%"); 末尾的% 不是错字吗?无论如何,谢谢你让我明白!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-08
    • 2015-03-19
    • 2011-12-15
    • 2016-12-10
    相关资源
    最近更新 更多