首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何安全地排水?

如何安全地排水?
EN

Stack Overflow用户
提问于 2019-09-30 06:45:40
回答 1查看 297关注 0票数 2

我读了几个同样的问题,但答案并不令人满意。

他们认为最好的答案是:

代码语言:javascript
运行
复制
while((ch = getchar()) != '\n') && ch != EOF);

有一个问题,如果我想在我要求回答之前把史丁抽干,比如:

代码语言:javascript
运行
复制
#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‘就会被阻塞。

那么什么是最好的选择呢?

=================

我在下面试过了,没有效果。

代码语言:javascript
运行
复制
#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中:

代码语言:javascript
运行
复制
#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)
EN

回答 1

Stack Overflow用户

发布于 2019-09-30 10:21:36

在过去的DOS中,我使用了以下顺序:

代码语言:javascript
运行
复制
while ( kbhit() )
{
    ch = getch();
}

kbhit()是用conio.h定义的,据我所知,不是可移植的。但是,您可能很幸运能够访问它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58162711

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档