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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:21:49