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

将含科学计数法的字符串矩阵转为单行数组的问题求助

为什么原代码中varArr赋值后会变成0.0?

先还原你的场景:你有一个存储数字矩阵的文本文件,用fgets读取到dataArr后,尝试先通过sscanf把每行的数值字符串存入strArr,再用atof转为double存入varArr,但发现明明strArr[i]和atof(strArr[i])都显示正确,赋值给varArr[i]后却变成了0.000000e+000。把atof移到第一个循环里就正常运行了,但你搞不懂原因。

核心问题:你的strArr是未初始化的野指针数组!

看你声明的char * strArr[numData][1000];——这是一个二维的字符指针数组,但你只声明了指针,却没有为每个指针分配实际的内存空间来存储字符串。也就是说,strArr[j]、strArr[j+1]这些指针都是“野指针”,它们指向的是内存中随机的、未被授权的地址。

原代码的错误连锁反应:

  • 第一个循环里的sscanf(dataArr[i], "%s %s %s", strArr[j], strArr[j+1], strArr[j+2]); 是在往野指针指向的随机内存地址写数据,这属于未定义行为。你当时看到strArr[i]的字符串格式正确,只是运气好——那块随机内存刚好没被其他程序/操作覆盖,暂时能读出正确内容,但这种状态是不可靠的。
  • 到第二个循环时,中间可能已经有其他内存操作(比如函数调用、栈帧变化)覆盖了之前野指针指向的那块内存,这时候strArr[i]指向的已经不是之前的数值字符串了,可能是一堆无效的乱码。而atof函数遇到无法解析的字符串时,会返回0.0,这就是你看到varArr[i]变成0的原因。

为什么修改后的代码能运行?

你把atof移到第一个循环里,相当于在野指针指向的内存被覆盖之前就立刻读取了里面的字符串,这时候那块内存还保留着sscanf写入的数值内容,所以atof能正确解析。但本质上这还是未定义行为,只是刚好在你的环境下没出问题——换个编译器、换个系统,可能还是会崩溃或者出现奇怪的结果。

更稳妥的写法

其实你完全不需要中间的strArr,可以直接用sscanf把数值读到varArr里,跳过字符串转换的步骤:

for (i = 8; i < lineCount; i++) {
    sscanf(dataArr[i], "%lf %lf %lf", &varArr[j], &varArr[j+1], &varArr[j+2]);
    j += 3;
}

如果一定要用字符串中转,那必须给strArr的每个指针分配内存,或者直接声明成字符数组(char strArr[numData][1000];,注意是字符数组而非指针数组)。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:14:49