尝试编写 fgets 函数的一个新版本 tfgets的代码——tfgets 函数的输入与 fgets 函数一致。 完成以下任务(1) tfgets 函数可设定一个超时时限,比如 10 秒,即用户如果不在 10 秒内键入一个正确的输入行,则 tfgets 返回一个警告提示信息; 否则 tfgets 返回一个指针,该指针指向用户键入的输入行; (2) 用户键入的信息需要与预设信息一致,即视为正确输入,可以 给出相关提示,让用户猜测应该输入什么(不得直接给出答案)
时间: 2024-02-28 18:53:52 浏览: 59
fgets( )和fputs( )(建议用其完全代替gets和puts函数)
以下是 tfgets 函数的代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include <termios.h>
#define TIMEOUT 10 // 超时时间为 10 秒
char *tfgets(char *str, int n, const char *predefined) {
struct termios oldt, newt;
int c, i = 0;
time_t start = time(NULL);
printf("Please enter: %s\n", predefined);
tcgetattr(STDIN_FILENO, &oldt);
newt = oldt;
newt.c_lflag &= ~(ICANON | ECHO);
tcsetattr(STDIN_FILENO, TCSANOW, &newt);
while (1) {
if (time(NULL) - start > TIMEOUT) { // 超时处理
printf("\nTime out, please try again.\n");
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
return NULL;
}
if (i == n - 1) break; // 达到输入长度限制
if (read(STDIN_FILENO, &c, 1) > 0) {
if (c == 127 || c == 8) { // 处理退格键
if (i > 0) {
i--;
printf("\b \b");
}
} else if (c == '\n' || c == '\r') { // 处理回车键
str[i] = '\0';
printf("\n");
break;
} else { // 处理其他键
str[i] = c;
i++;
printf("*");
}
}
}
tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
if (strcmp(str, predefined) == 0) { // 预设信息匹配
printf("You entered the correct answer!\n");
return str;
} else {
printf("Sorry, your answer is incorrect.\n");
return NULL;
}
}
```
tfgets 函数的输入与 fgets 函数一致,包括输入缓冲区、缓冲区大小和文件指针等参数。函数中使用了 termios 库来控制终端的属性,从而实现关闭回显和规范模式。tfgets 函数使用了一个 while 循环来读取用户输入,如果输入超时,则返回空指针;如果输入达到长度限制,则退出循环,将输入缓冲区中的最后一个字符设置为 '\0'。最后,tfgets 函数会将用户输入与预设信息进行比较,如果匹配,则返回输入缓冲区的指针,否则返回空指针。函数中使用了 printf 函数来输出提示信息,避免了直接给出答案的情况。
阅读全文