C语言程序中fgets函数被跳过的问题求助
解决fgets被跳过无法获取文件名的问题
我一眼就看出问题出在哪了——你用getchar()读取操作选项后,输入缓冲区里还留着用户按下的换行符(\n),后面的fgets()会直接把这个换行符当成输入内容,所以看起来像是被跳过了。而且fflush(stdin)是C标准里的未定义行为,在很多编译器里根本不起作用,别再依赖它清缓冲区了!
给你两个靠谱的解决方案:
方案一:手动清除缓冲区残留的换行符
在读取完操作选项后,用循环把缓冲区里剩下的字符(包括换行符)全部吃掉,确保后续输入不受影响:
//之前的部分代码 printf("######################\n"); printf("# 1. 注册文件 #\n"); printf("# 2. 获取全局列表 #\n"); printf("# 3. 下载文件 #\n"); printf("# 4. 退出程序 #\n"); printf("######################\n"); printf("请输入选择:"); action = getchar(); action -= '0'; // 关键:清除缓冲区里的残留字符,直到遇到换行符 while (getchar() != '\n'); sprintf(input, "[%d]--", action); switch (action) { case 1: printf("请输入文件名:"); char filename[256]; fgets(filename, sizeof(filename), stdin); // 可选:去掉fgets读取到的末尾换行符 filename[strcspn(filename, "\n")] = '\0'; // 后续处理文件名逻辑 break; // 其他case分支... }
用while循环而不是单次getchar,是为了处理用户输入数字后还输入其他字符的情况(比如输入1abc),确保缓冲区被彻底清空。
方案二:改用fgets读取操作选项(更稳妥)
彻底避开getchar的坑,直接用fgets读取整行输入,再把输入的字符串转换成数字:
//之前的部分代码 printf("######################\n"); printf("# 1. 注册文件 #\n"); printf("# 2. 获取全局列表 #\n"); printf("# 3. 下载文件 #\n"); printf("# 4. 退出程序 #\n"); printf("######################\n"); printf("请输入选择:"); char choice_buf[10]; fgets(choice_buf, sizeof(choice_buf), stdin); // 把输入的字符串转换成整数操作码 action = atoi(choice_buf); sprintf(input, "[%d]--", action); switch (action) { case 1: printf("请输入文件名:"); char filename[256]; fgets(filename, sizeof(filename), stdin); filename[strcspn(filename, "\n")] = '\0'; // 后续处理文件名逻辑 break; // 其他case分支... }
这种方式从根源上避免了缓冲区残留问题,而且能兼容用户的各种输入习惯。另外记得用strcspn()去掉fgets读取到的换行符,否则文件名末尾会带个多余的换行符。
内容的提问来源于stack exchange,提问作者Lithilion
相关产品推荐
相关产品推荐

