我读了几个同样的问题,但答案并不令人满意。
他们认为最好的答案是:
while((ch = getchar()) != '\n') && ch != EOF);
有一个问题,如果我想在我要求回答之前把史丁抽干,比如:
#define DRAIN() while((ch = getchar()) != '\n') && ch != EOF)
int fun() {
...
DRAIN(); //aaa, wipe other's ass before me
ch = getchar();//bbb, ask my answer
DRAIN(); //ccc, wipe myown ass
...
}
“aaa”的目的是从以前的代码中删除stdin中的字符,可能在输入趣味()之前输入其他未知代码。
但是,如果在'aaa',在stdin中没有字符,'aaa‘就会被阻塞。。
那么什么是最好的选择呢?
=================
我在下面试过了,没有效果。
#define DRAIN() do { \
char ch___ = 0; \
fd_set fds___; \
struct timeval tv___; \
int ret___ = 0; \
FD_ZERO(&fds___); \
FD_SET(STDIN_FILENO, &fds___); \
tv___.tv_sec = 0; \
tv___.tv_usec = 5000; \
ret___ = select(STDIN_FILENO + 1, &fds___, NULL, NULL, &tv___);\
printf("ret:%d\n", ret___); \
if (ret___ > 0) { \
while(getchar()); \
} \
}while(0)
int main()
{
printf("#");
fflush(stdout);
getchar();
DRAIN();
printf(">");
fflush(stdout);
printf(":%c\n", getchar());
DRAIN();
return 0;
}
$ ./a.out
#123
ret:0
>:2
ret:0
====2nd edit====
看来这是可行的,我在Linux中:
#define DRAIN() do { \
int flg___ = 0; \
int flg___bak = 0; \
char ch___ = 0; \
flg___ = fcntl(STDIN_FILENO, F_GETFL, 0); \
flg___bak = flg___; \
flg___ |= O_NONBLOCK; \
fcntl(STDIN_FILENO, F_SETFL, flg___); \
while((ch___ = getchar()) != '\n' && ch___ != EOF); \
fcntl(STDIN_FILENO, F_SETFL, flg___bak); \
}while(0)
发布于 2019-09-30 10:21:36
在过去的DOS中,我使用了以下顺序:
while ( kbhit() )
{
ch = getch();
}
kbhit()
是用conio.h
定义的,据我所知,不是可移植的。但是,您可能很幸运能够访问它。
https://stackoverflow.com/questions/58162711
复制相似问题