尝试编写 fgets 函数的一个新版本 tfgets——tfgets 函数的输入与 fgets 函数一致。用户键入的信息需要与预设信息一致,即视为正确输入, 如果用户连续输错三次,则尝试使用非本地跳转,给出提示, 并不允许该用户再次尝试。请编写一段代码实现上述功能
时间: 2024-02-29 11:53:21 浏览: 63
好的,这里是一个可能的实现:
```
#include <setjmp.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_TRIES 3
#define PASSWORD "mypassword"
jmp_buf env;
int tries = 0;
char* tfgets(char* str, int n, FILE* stream) {
char* ret = fgets(str, n, stream);
if (ret == NULL) {
return ret;
}
// 将读入的字符串最后的换行符替换为结束符 '\0'
int len = strlen(str);
if (len > 0 && str[len - 1] == '\n') {
str[len - 1] = '\0';
}
return ret;
}
int main() {
char str[100];
if (setjmp(env) != 0) {
printf("You've been locked out\n");
return 1;
}
while (tries < MAX_TRIES) {
printf("Enter password: ");
if (tfgets(str, 100, stdin) == NULL) {
break;
}
if (strcmp(str, PASSWORD) == 0) {
printf("Access granted\n");
break;
}
tries++;
}
if (tries == MAX_TRIES) {
printf("Too many tries\n");
longjmp(env, 1);
}
return 0;
}
```
在这个实现中,我们定义了一个 `tfgets` 函数,它与 `fgets` 函数具有相同的参数和返回值,但是它会将读入的字符串最后的换行符替换为结束符 '\0'。在 `main` 函数中,我们使用一个循环来尝试多次输入密码,如果尝试次数超过了 `MAX_TRIES`,则会给出警告并使用 `longjmp` 函数跳转到 `env` 标记处,禁止该用户再次尝试。在循环中,我们使用 `tfgets` 函数来获取用户输入,并将其与预设的密码进行比较,如果匹配则输出 "Access granted" 并退出循环。
这个实现使用了 `setjmp` 和 `longjmp` 函数来实现非本地跳转。`setjmp` 函数保存了当前程序状态并返回一个标记,`longjmp` 函数则可以使用该标记来恢复程序状态并跳转到指定位置。在这个实现中,我们在 `main` 函数的循环中使用了 `setjmp` 函数来保存程序状态,并在循环结束后使用 `longjmp` 函数来跳转到 `env` 标记处,禁止该用户再次尝试。
阅读全文