为什么我的C程序只执行第一个printf,不执行提示输入分数的printf语句?
代码错误排查与修复方案
你的代码存在以下5个可直接复现你描述问题的错误:
- 缺少必要头文件:使用
printf、fopen、fscanf等IO函数必须引入<stdio.h>头文件,仅引入<stdlib.h>会导致函数行为未定义,部分编译器不会显式报错但运行逻辑异常。 - 输出文件打开校验逻辑错误:你打开
fout后仍然判断fin是否为NULL,既无法检测输出文件的打开失败问题,错误提示文本也和实际操作不匹配。 - 标准输出缓冲区未刷新:
printf输出的提示行没有换行符,而终端默认采用行缓冲机制,内容会暂存在缓冲区不会直接打印到屏幕,自然看不到输入提示。 - 文件关闭逻辑位置错误:
fclose(fout)被写在while循环内部,第一次循环执行完就会关闭输出文件,第二次循环调用fprintf时操作的是已释放的文件指针,会直接触发运行时错误导致程序异常退出。 fscanf参数写法不规范:读取字符串到数组时直接传数组名name即可,不需要加取地址符&,同时建议加长度限制避免缓冲区溢出。
修复后的完整代码
#include <stdio.h> #include <stdlib.h> int main(void){ FILE *fin, *fout; char name[100]; float mark; fin = fopen("saved.lst", "r"); if (fin == NULL) { printf("无法打开待读取的文件\n"); return -1; } fout = fopen("updated.txt", "w"); // 修正此处的校验逻辑 if (fout == NULL) { printf("无法打开待写入的文件\n"); fclose(fin); // 退出前关闭已经打开的输入文件 return -1; } // 修正fscanf参数,加长度限制避免溢出 while (fscanf(fin, "%99s", name) == 1) { printf("请为%s输入分数: ", name); fflush(stdout); // 显式刷新缓冲区保证提示直接输出 scanf("%f", &mark); fprintf(fout, "%s: %f\n", name, mark); } // 把fclose移到循环外 fclose(fin); fclose(fout); return 0; }
额外运行注意事项
你需要保证程序运行的同目录下存在名为saved.lst的文本文件,且文件内每行/每个空白符分隔一个姓名,程序才能正常读取到内容触发输入提示。
内容的提问来源于stack exchange,提问作者daisy jongerine
相关产品推荐
相关产品推荐

