尝试编写 fgets 函数的一个新版本 tfgets——tfgets 函数的输入与 fgets 函数一致。) 如果用户连续输错三次,则尝试使用非本地跳转,给出提示, 并不允许该用户再次尝试。
时间: 2023-08-22 22:25:20 浏览: 72
下面是一个可能的实现:
```c
#include <stdio.h>
#include <string.h>
#include <setjmp.h>
#define MAX_ATTEMPTS 3
int tfgets(char *s, int size, FILE *stream) {
static jmp_buf buf;
static int attempts = 0;
int ret;
if (setjmp(buf)) {
fprintf(stderr, "You have exceeded the maximum number of attempts.\n");
exit(1);
}
ret = fgets(s, size, stream) != NULL;
if (!ret) {
attempts++;
if (attempts == MAX_ATTEMPTS) {
longjmp(buf, 1);
}
} else {
attempts = 0;
}
return ret;
}
int main() {
char name[80];
printf("What is your name? ");
if (tfgets(name, sizeof(name), stdin)) {
name[strcspn(name, "\r\n")] = '\0'; // remove newline
printf("Hello, %s!\n", name);
}
return 0;
}
```
该程序通过调用tfgets函数读取用户的输入,并输出问候信息。如果用户连续输入了三次错误的字符串,则tfgets函数使用longjmp函数跳转到setjmp处,输出错误信息并退出程序,使得程序无法再次调用tfgets函数。注意,为了避免输入字符串包含换行符,程序使用strcspn函数将其替换为字符串结束符。
阅读全文