首页 > 解决方案 > 无限输入直到出现空白

问题描述

我怎样才能制作一个“无限”阅读器来阅读每个输入,直到用户按下回车键?如:

#include <stdio.h>

int main()
{
int A;
scanf("%i", &A);

/// here i'd like to insert a loop function that will repeat every time the user insert a number 



scanf("%i, &A);
printf("Number: ", A);
/// end loop
    return 0;
}


标签: c

解决方案


制作一个“无限”阅读器来读取每个输入,直到用户按下回车键?

通过通常的方式阅读一长行可能无法真正做到这一点。

线路限制

实现应支持行包含至少 254 个字符的文本文件,包括终止换行符。宏的值BUFSIZ应至少为 256。 C17dr § 7.21.2 9

也许您的实现可以处理更多或无限 - 或者代码限制为 254。

输入缓冲

stdin通常是行缓冲的。因此scanf()输入包括'\n'. 如果您可以在输入中使用退格键来删除数据,则很可能是这种情况。


有一些方法可以覆盖缓冲,一些是标准的,一些是特定于实现的。你会需要这些。我想这只是关于 OP 目标的部分答案。


建议改为使用缓冲区读取一行用户输入,然后对其进行解析。fgets()char buffer[BUFSIZ + 1]

char buffer[BUFSIZ+1];
while (fgets(buffer, sizeof buffer, stdin)) {

  // Parse the line looking for an int
  // Best to use strtol and family, here, for simplicity, use `sscanf()`
  int A;
  int count = sscanf(buffer, "%i", &A);
  if (count == 1) {
    printf("%d\n", A);
  } else if (buffer[0] == '\n') {
    break;
  } else {
    printf("Unexpected input <%s>\n", buffer);
    break;
  }
}

scanf("%i", &A);缺乏检测一行的能力,就像"\n"读取一样"%i",悄悄地消耗所有前导空白(包括换行符),直到出现非空白。


推荐阅读