在标准C的时限内输入
我正在完成我的任务,并且必须使用C-Free 5.0。 只需要你的帮助来解决这个难题。 我希望为用户在到期前输入答案实现时间限制。 我已经尝试过这段代码,但它在scanf()函数中遇到了阻塞。 有没有其他方法,如解锁输入或其他东西。 我试图实现’ #include
‘但该程序没有该库。
#include #include #include #include int main() { char st[10]; printf ("Please enter a line of text : "); time_t end = time(0) + 5; //5 seconds time limit. while(time(0) %s<\n", st); exit(0); } } main(); }
这是一个示例程序,显示如何在stdin
文件描述符上使用O_NONBLOCK
标志。
#include #include #include #include #include #define INPUT_LEN 10 int main() { printf ("Please enter a line of text : "); fflush(stdout); time_t end = time(0) + 5; //5 seconds time limit. int flags = fcntl(STDIN_FILENO, F_GETFL, 0); fcntl(STDIN_FILENO, F_SETFL, flags | O_NONBLOCK); char answer[INPUT_LEN]; int pos = 0; while(time(0) < end) { int c = getchar(); /* 10 is new line */ if (c != EOF && c != 10 && pos < INPUT_LEN - 1) answer[pos++] = c; /* if new line entered we are ready */ if (c == 10) break; } answer[pos] = '\0'; if(pos > 0) printf("%s\n", answer); else puts("\nSorry, I got tired waiting for your input. Good bye!"); }
因为你有fcntl.h
尝试将stdin设置为非阻塞。 它不漂亮(主动等待),但如果你没有select
那么这是最简单的方法:
#include #include #include #include #include #include int main() { // get stdin flags int flags = fcntl(0, F_GETFL, 0); if (flags == -1) { // fcntl unsupported perror("fcntl"); return -1; } // set stdin to non-blocking flags |= O_NONBLOCK; if(fcntl(0, F_SETFL, flags) == -1) { // fcntl unsupported perror("fcntl"); return -1; } char st[1024] = {0}; // initialize the first character in the buffer, this is generally good practice printf ("Please enter a line of text : "); time_t end = time(0) + 5; //5 seconds time limit. // while while(time(0) < end // not timed out && scanf("%s", st) < 1 // not read a word && errno == EAGAIN); // no error, but would block if (st[0]) // if the buffer contains something printf ("Thank you, you entered >%s<\n", st); return 0; }
对代码的注释: if (st != NULL)
将始终满足,因为st
是堆栈指针。