我试图用字符读取一个数字字符,但我不知道stdin缓冲区是否为空.
我的第一个解决方案是在stdin缓冲区中寻找'\n'字符,但如果我输入以''(空格)分隔的多个数字,那就不好了.
我怎么知道在stdin缓冲区中我是否有字符?
我不得不用C语言做,并且便携.
有几种说法:
轮询或选择超时为 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)
...只要您正确处理重读、比缓冲区长的字符串以及其他现实生活中的并发症。