C语言分割文本文件:Socket编程中price数组赋值始终为0的解决方法
问题修复方案:Price数组始终返回0的原因与解决办法
老哥,我太懂这个坑了!你这个问题99%是因为读取double类型时用错了格式化字符串,其他字段正常是因为int和char的格式符没搞错,唯独double的输入格式符很容易踩坑。
核心问题分析
C语言里,用sscanf(你应该是用它来分割fgets读入的行吧?)读取double类型变量时,必须用%lf格式符;而输出double时才用%f。很多人会搞混这俩,要是你把price的格式符写成了%d(int的格式符),那程序会把double变量的内存当成int来解析,结果要么是0,要么是乱码,刚好你遇到的是全0的情况。
看你的数组声明:
int id[10]; char name[10][50]; int qrty[10]; double price[10];
price是double类型,但如果你的分割赋值代码写成了这样(错误示例):
sscanf(line, "%d\t%s\t%d\t%d", &id[i], name[i], &qrty[i], &price[i]);
那肯定会出问题。
修复步骤
1. 修正格式化字符串
把price对应的格式符改成%lf,同时给字符串读取加长度限制(防止缓冲区溢出,因为name是[50],所以用%49s留1字节存结束符\0):
char line[256]; int i = 0; while (fgets(line, sizeof(line), fp) != NULL && i < 10) { // 正确的格式化字符串,price用%lf int read_count = sscanf(line, "%d\t%49s\t%d\t%lf", &id[i], name[i], &qrty[i], &price[i]); if (read_count == 4) { // 4个字段都成功读取,才移动索引 i++; } else { // 可选:打印错误行,方便排查格式问题 fprintf(stderr, "Warning: 无效的行格式,跳过该行:%s", line); } }
2. 额外注意事项
- 一定要检查
sscanf的返回值:返回值是成功读取的字段数,如果不等于4,说明该行格式有问题(比如少了制表符、price不是数字),跳过该行避免影响后续数组赋值。 - 如果你的文本文件里price用的是逗号作为小数分隔符(比如
19,99而不是19.99),那需要先设置locale,比如setlocale(LC_NUMERIC, "");,不过这种情况比较少见。 - 确保fgets读入的行没有被截断:如果行太长超过
line的长度,会导致分割失败,所以line的长度要足够大(比如256或512)。
验证方法
修复后可以加个打印代码验证:
for (int j = 0; j < i; j++) { printf("id: %d, name: %s, qty: %d, price: %.2f\n", id[j], name[j], qrty[j], price[j]); }
这里输出price用%f就可以了,和输入的%lf区分开哦!
内容的提问来源于stack exchange,提问作者visva
相关产品推荐
相关产品推荐

