You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么我的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:45:03