使用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
相关产品推荐
相关产品推荐

