2010-10-30 119 views
1

我在Linux操作系统上使用C语言进行编程。我正在编写一个扫描用户输入的程序。但是,我希望scanf有一定的时间限制。例如,如果用户在10秒内没有在键盘上输入任何内容,它将跳过scanf并转到下一行。我使用警报(10)等待10秒钟,但是当我到警报处理程序时,我不知道如何操作以跳过scanf。以C语言编程终止scanf

有没有函数可以跳过scanf或例如将\ n写入输入缓冲区?

回答

1

从警报处理程序返回; scanf的返回值应该反映错误情况已经发生。 (scanf在错误时返回EOF)。

注意!您必须使用sigaction,因为signal可能会使得read(),系统调用底层scanf()可自动重新启动。

#include <stdio.h> 
#include <signal.h> 

void handler(int signo) 
{ 
    return; 
} 

int main() 
{ 
    int x; 
    struct sigaction sa; 

    sa.sa_handler = handler; 
    sigemptyset(&sa.sa_mask); 
    sa.sa_flags = 0; 
    sigaction(SIGALRM, &sa, NULL); 

    alarm(5); 

    if (scanf("%d", &x) == 1) 
    { 
    printf("%d\n", x); 
    alarm(0); // cancel the alarm 
    } 
    else 
    { 
    printf("timedout\n"); 
    } 
    return 0; 
} 
0

您可能要考虑使用ncurses而不是标准I/O。这有点神秘,但它使你免受各种编码滋扰(可移植性和“你必须完全正确地编写它,否则它将无法可靠地工作,并且找到文档好运”)。而halfdelay功能似乎提供了一种模式,正是你在这里寻找的。