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

使用fscanf读取姓名与数值时格式异常,寻求解决方法

问题分析与修复方案

问题根源

你用%s读取姓名时,%s会以空白字符(空格、换行等)作为结束标志,所以文件里的Jim:会被完整读入name变量(因为冒号后才是空格),导致姓名带冒号;同时后续的%lf无法匹配到正确的浮点数,balance未被赋值,输出默认的0.0000。

修复代码

调整fscanf的格式字符串,明确以冒号作为姓名的分隔符,同时跳过无关的空格和冒号:

#include <stdio.h>

int main() {
    FILE *filep = fopen("your_file.txt", "r");
    if (!filep) {
        perror("Failed to open file");
        return 1;
    }

    char name[32]; // 确保数组大小足够容纳姓名
    double balance;
    // 格式字符串说明:
    // " " 跳过所有前置空白(包括行首空格、换行)
    // "%[^:]" 读取所有非冒号字符到name(即姓名本身)
    // ": " 匹配文件中的冒号和后续空格,跳过不存储
    // "%lf" 读取浮点数到balance
    while (fscanf(filep, " %[^:]: %lf", name, &balance) == 2) {
        printf("%s: %.4lf\n", name, balance);
    }

    fclose(filep);
    return 0;
}

关键注意点

  • 用fscanf(...) == 2判断是否成功读取两个数据,比!=EOF更严谨,避免格式不匹配时进入死循环。
  • 要保证name数组的大小足够,防止超长姓名导致缓冲区溢出。
  • 格式字符串开头的空格必须保留,否则会把行首的空格读进name变量里。

内容的提问来源于stack exchange,提问作者gholt12

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 21:05:11