C语言中fgets()无法接收用户键盘输入问题求助
解决C语言代码中fgets无法接收输入的问题
核心问题原因
- scanf残留换行符:使用
scanf("%d", &c)读取选择项时,输入数字后按下的回车(\n)会留在标准输入缓冲区。后续调用fgets时,它会直接读取这个换行符,误以为已经完成输入,导致看起来无法接收用户输入。
其他代码问题
- switch语句缺少
break:case 1执行完写入操作后,会自动执行case 2的读取操作,不符合按需读写的逻辑。 - 结构体值传递:write函数接收的是结构体副本,若后续需要修改结构体其他字段,副本的修改不会同步到主函数的变量。
- 文件操作错误:write函数提前关闭文件指针,导致后续read操作使用悬空指针,属于未定义行为;且写入后文件指针停在末尾,直接读取会无法获取内容。
- read函数循环逻辑:do-while会先执行一次读取,若文件为空会输出EOF对应的乱码字符。
修复方案
- 清空输入缓冲区:在scanf后加入循环,清空缓冲区所有残留字符直到换行符:
while ((getchar()) != '\n'); - 给switch的case添加break:确保每个case执行后跳出switch。
- 结构体改为指针传递:让write函数直接修改主函数的结构体变量。
- 统一管理文件关闭:主函数中统一关闭文件,避免重复关闭或悬空指针操作。
- 调整文件指针位置:写入后用
fseek(fp, 0, SEEK_SET)将指针移到文件开头,方便读取。 - 修正read函数循环:改用while循环先判断再读取,避免输出乱码。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> typedef struct Details{ int num; char message[100]; }Notes; void write(FILE*, Notes*); void read(FILE*); int main() { int c; FILE *fp = fopen("Notes.txt", "w+"); Notes txt; if(fp == NULL) { printf("无法打开文件\n"); return 1; } printf("选择操作\n1.写入\n2.读取\n"); scanf("%d", &c); // 清空输入缓冲区残留字符 while ((getchar()) != '\n'); switch(c){ case 1: write(fp, &txt); break; case 2: read(fp); break; default: printf("无效选项\n"); } fclose(fp); return 0; } void write(FILE* fp, Notes *msg) { puts("请输入文本:"); fgets(msg->message, sizeof(msg->message), stdin); fputs(msg->message, fp); // 将文件指针移到开头,方便后续读取 fseek(fp, 0, SEEK_SET); } void read(FILE* fp) { char ch; while((ch = fgetc(fp)) != EOF){ printf("%c", ch); } }
内容的提问来源于stack exchange,提问作者IndyRose
相关产品推荐
相关产品推荐

