检查stdin缓冲区是否为空

Tan*_*ura 5 c

我试图用字符读取一个数字字符,但我不知道stdin缓冲区是否为空.

我的第一个解决方案是在stdin缓冲区中寻找'\n'字符,但如果我输入以''(空格)分隔的多个数字,那就不好了.

我怎么知道在stdin缓冲区中我是否有字符?

我不得不用C语言做,并且便携.

ara*_*aer 9

有几种说法:

轮询选择超时为 0 - 这些将立即返回,EAGAIN如果没有可用数据,则结果为 -1 并带有 errno或带有数据的描述符数量(一个,因为您只检查标准输入)。

ioctl是使用描述符的瑞士军刀。您需要的请求是I_NREAD

if (ioctl(0, I_NREAD, &n) == 0 && n > 0)
    // we have exactly n bytes to read
Run Code Online (Sandbox Code Playgroud)

然而,正确的解决方案是将您得到的所有内容(使用scanf)作为一行读取,然后处理结果 - 这对于sscanf以下内容来说已经足够了:

char buf[80]; // large enough
scanf("%79s", buf); // read everything we have in stdin
if (sscanf(buf, "%d", &number) == 1)
    // we have a number
Run Code Online (Sandbox Code Playgroud)

...只要您正确处理重读、比缓冲区长的字符串以及其他现实生活中的并发症。

  • 如果我正在尝试这样的东西 `while(!feof(stdin)) { c = getchar(); putchar(c); }` 将进入无限循环 (2认同)