我想知道如何检查我的输入缓冲区(可能是它的名为stdin)是否为空。 如果缓冲区为空,我不希望程序停止,并且我不希望输入必须以' \ n'结束,因此仅使用scanf是不够的。
我尝试在谷歌和这个网站上搜索但没有答案就够了。 我试过像这样使用feof(stdin):
int main()
{
char c,x;
int num;
scanf("%c",&c);
scanf("%c",&x);
num=feof(stdin);
printf("%d",num);
}
但无论输入如何,它所做的只是打印0。在第二次scanf之后添加fflush(stdin)得到相同的结果。 其他答案建议使用选择和民意调查,但我找不到这些功能的任何解释。 其他一些论坛告诉我使用getchar(),但我认为他们误解了我的问题。
在谷歌搜索上我尝试过:C如何检查输入缓冲区为空,C stdin为空,c"输入缓冲区"检查空。 这是一个普遍的问题,它不适用于特定的代码,所以我无需为什么需要它。**如果您建议我使用select / poll,您能否添加一些关于如何使用它们的说明?
答案 0 :(得分:1)
以下是解决此问题的代码:
fseek (stdin, 0, SEEK_END);
num = ftell (stdin);
fseek
会将指针放在stdin
输入缓冲区的末尾。 ftell
将返回文件大小。
答案 1 :(得分:0)
如果你不想阻止一个空的 stdin ,你应该能够 fcntl 将它强加到 O_NONBLOCK 并像对待任何一样对待它其他非阻塞I / O.此时,对 fgetc 之类的调用应立即返回,或者使用值,或者如果流为空则返回 EAGAIN 。
答案 2 :(得分:0)
class JavaAapplication1
试试这个,添加int ch = getc(stdin);
if (ch == EOF)
puts("stdin is empty");
else
ungetc(ch, stdin);
以消除副作用。
答案 3 :(得分:0)
您可以使用select()
来处理阻止问题,并且手册页select(2)有一个很好的示例来轮询stdin
。这仍然没有解决需要行分隔符('\n'
)的问题。这实际上是由于终端处理输入的方式。
在Linux上,你可以使用termios,
#include <stdio.h>
#include <unistd.h>
#include <termios.h>
// immediate mode getchar().
static int getch_lower_(int block)
{
struct termios tc = {};
int status;
char rdbuf;
// retrieve initial settings.
if (tcgetattr(STDIN_FILENO, &tc) < 0)
perror("tcgetattr()");
// non-canonical mode; no echo.
tc.c_lflag &= ~(ICANON | ECHO);
tc.c_cc[VMIN] = block ? 1 : 0; // bytes until read unblocks.
tc.c_cc[VTIME] = 0; // timeout.
if (tcsetattr(STDIN_FILENO, TCSANOW, &tc) < 0)
perror("tcsetattr()");
// read char.
if ((status = read(STDIN_FILENO, &rdbuf, 1)) < 0)
perror("read()");
// restore initial settings.
tc.c_lflag |= (ICANON | ECHO);
if (tcsetattr(STDIN_FILENO, TCSADRAIN, &tc) < 0)
perror("tcsetattr()");
return (status > 0) ? rdbuf : EOF;
}
int getch(void)
{
return getch_lower_(1);
}
// return EOF if no input available.
int getch_noblock(void)
{
return getch_lower_(0);
}