当'输入'

时间:2014-03-15 07:00:35

标签: c while-loop do-while getchar

我正在尝试制作一个无需用户输入即可无限运行的循环,直到' Enter'被压了。 这是我的程序的简化版本:

do {

printf("Hello\n");

}while(!getchar());

当我编译并运行程序时,只输出一个' Hello'并且程序将不会继续,直到Enter按下然后程序将退出。我可以知道我错了哪一部分?

谢谢。

4 个答案:

答案 0 :(得分:2)

这并不容易。您的问题是标准I / O功能是同步的。你的getchar正在等待一些输入(输入行是准确的)并阻止执行程序直到按下Enter。要在不阻塞的情况下继续执行,您需要使用异步I / O操作或select(或poll)。 Select允许您检测下一个I / O操作是否会阻塞。查看select的文档并尝试:

#include<stdio.h>
#include<unistd.h>
#include <sys/select.h>

int main() {
    fd_set          s;
    struct timeval  timeout;

    timeout.tv_sec = 0;
    timeout.tv_usec = 100000;

    do {
        printf("Hello\n"); 
        fflush(stdout);
        FD_ZERO(&s);
        FD_SET(STDIN_FILENO, &s);
        select(STDIN_FILENO+1, &s, NULL, NULL, &timeout);
    } while (FD_ISSET(STDIN_FILENO, &s) == 0);

}

答案 1 :(得分:0)

在Linux上,终端是 tty ,它通常以某种方式由内核缓冲。阅读tty demystifiedline discipline

您可以使用ncursesreadline

阅读getchar(3)手册页(例如,在终端中使用man 3 getchar)。它说

  

getchar()返回读取的字符          unsigned char在文件结尾或错误时转换为int或EOF。

所以你的测试是错误的,你可能希望while(getchar() != EOF)不等待某些键盘输入。换句话说,getchar始终阻止用户输入。你可以用 Ctrl D

给出一个文件结尾

答案 2 :(得分:0)

你的程序被卡住了,因为getchar()函数正在等待输入。当你输入东西(输入)时,getchar()返回非零值,因此while语句变得错误,这就是循环结束的原因。

答案 3 :(得分:0)

需要弄清楚Canonical与非规范终端输入的区别

正如你在canonical终端上尝试的那样,你现在已经有了什么限制。所以我只是向你解释non-canonical终端

对于非规范输入 - 请考虑vivim或其他 - 您按下一个字符,它立即可供该程序使用。在你回归之前,你不会被阻止。系统不对字符进行编辑;键入后,它们即可供程序使用。程序可以适当地解释事物。现在,vim确实做了许多看起来有点像规范输入的事情。例如,退格键向后移动,并在输入模式下删除那里的内容。但那是因为vim选择让它表现得那样。

所以你需要使用non-canonical flavor