我在文本文件中有一个数字矩阵,如下所示:
0.0000e+00 100.00E-15-100.00E-15
2.5000e-02 100.00E-15-150.00E-15
5.0000e-02 150.00E-15-100.00E-15
7.5000e-02 100.00E-15-100.00E-15
1.0000e-01 100.00E-15-100.00E-15
1.2500e-01 100.00E-15-100.00E-15
1.5000e-01 150.00E-15-100.00E-15
1.7500e-01 150.00E-15-100.00E-15
2.0000e-01 150.00E-15-100.00E-15
2.2500e-01 200.00E-15-100.00E-15
2.5000e-01 150.00E-15-100.00E-15
2.7500e-01 200.00E-15-150.00E-15
等等。
我可以使用fgets扫描它们,有效地生成一个非常长的数字串。我面临的问题是矩阵的大小是可变的,而且我对编程还比较陌生,所以我对如何处理这个问题的唯一知识就是使用sscanf和atof。但是,当我试图将atof转换的值存储到数组中时,它会给出奇怪的行为(例如“记住”最后一个atof转换,或者只输入0)

char * strArr[numData][1000];
double varArr[numData];  /* number of data values in the matrix, in this case, 36 */
int i = 0;
int j = 0;

/* The actual data is preceded by a header, hence 8 */
/* dataArr is the lines of the text file that I retrieved using fgets */
/* I'm attempting to store each "string" in a string array, and then convert them to floats using the second loop */

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

for (i = 0; i < numData; i++);
{
    varArr[i] = atof(strArr[i]);
}

最后一部分给出了varArr[i]的错误值。老实说,我现在有点紧张。
strArr[i]作为字符串是正确的浮点数,而atof(strArr[i])是正确的浮点数,但是当我尝试将atof(strArr[i])存储到varArr[i]中(这是一个浮点数数组)时,得到0.000000e+000。我错过什么了吗?
例如
strArr[1] returns 100.00E-15
atof(strArr[1]) returns 100.00E-15
varArr[1] = atof(strArr[1]) returns 0.000000e+000

编辑2:已解决
结果我需要把atof函数放在第一个循环中,例如:
for (i = 8; i < lineCount; i++)
    {
        sscanf(dataArr[i], "%s %s %s", strArr[j], strArr[j+1], strArr[j+2]);
        varArr[j] = atof(strArr[j]);
        varArr[j+1] = atof(strArr[j+1]);
        varArr[j+2] = atof(strArr[j+2]);
        j = j + 3;
    }

我不知道为什么,但它工作,所以我很高兴。

最佳答案

在C中正确使用字符串通常需要动态分配,并仔细考虑何时分配、分配什么以及释放什么。这很难纠正,你真的希望尽可能少地使用字符串。
如果您不想处理异常长的输入行(似乎是您的情况),您可以只使用一个字符串缓冲区,它只临时保存字符串,直到以下字符串替换它:

char strArr[1000];

使用fgets填充。然后使用sscanf从中获取数字:
sscanf(strArr, "%f %f %f", &varArr[j], &varArr[j+1], &varArr[j+2]);

注意:不需要从一个字符串中提取3个字符串,并将每个字符串分别转换为float。像上面的代码一样,立即提取3个float可以消除额外的字符串及其内存管理。

09-05 23:32