将包含科学记数字的字符串矩阵转换为单行数组

时间:2018-05-27 21:38:12

标签: c

我在文本文件中有一个数字矩阵,如下所示:

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转换的值存储到数组中时,它会产生奇怪的行为(例如"记住"最后一次转换,或者只输入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;
    }

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

1 个答案:

答案 0 :(得分:1)

在C中正确使用字符串通常涉及动态分配并仔细考虑何时以及分配和释放什么。这很难做到,你真的想让字符串尽可能少。

如果你不想处理异常长的输入行(似乎是你的情况),你可以只使用一个字符串缓冲区,它只暂时保存字符串,直到下面的字符串替换它:

char strArr[1000];

使用fgets填充它。然后使用sscanf从中获取数字:

sscanf(strArr, "%f %f %f", &varArr[j], &varArr[j+1], &varArr[j+2]);

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