在 C 中将数据从字符串转换为浮点数组

Convert data from a string to float arrays in C

我需要帮助来尽可能简单且不占用大量内存地转换数据。 所以数据在一个看起来像这样的字符串中:

4519.8081,01426.5819
4519.8081,01426.5818
4519.8082,01426.5815
4519.8083,01426.5812

我需要从字符串中转换它,所以我得到两个浮点数组 y 和 x。 数组 y 应包含第一列的值(列以逗号分隔) 数组 x 应包含第二列中的值。

这将在微控制器上完成,所以我真的需要尽可能简约!

更新:我认为这些信息足以获取一个函数或关于如何执行该函数的指针,我很抱歉。

一般objective是记录GPS数据,以便获得几个坐标点,从中我可以绘制一条行进路径。它将在 320x240 TFT 屏幕上粗略显示。我将 ATmega32 MCU 与 GPS 模块、SD 卡 reader 以及提到的屏幕一起使用。

详细说明 - 我正在以上述格式记录 GPS 数据。数据被写入一个 txt 文件

4519.8081,01426.5819
4519.8081,01426.5818
4519.8082,01426.5815
4519.8083,01426.5812

每一行都是一个记录点及其纬度和经度。 4519.8081, 01426.5819 实际上是 45°19.8081'。 14°26.5819'

在将一定数量的点(尚未定义确切数量,但由于内存限制,数量有限)记录到 SD 卡后,我存储了数据。

此时我需要将我拥有的数据转换成两个数组,这两个数组将用作在显示器上绘制这些点并在它们之间绘制路径的坐标。

所以如果我有一个带有坐标的数组 X[n] 和数组 Y[n],我会这样做:

for (int i=0; i<n-1; i++){
    display.drawLine(x[i], y[i], x[i+1], y[i+1])
}

这将遍历数组并根据坐标绘制路径。

现在,我知道坐标必须在 320x240 范围内,因为这是我显示器的分辨率。这就是为什么我不能按原样传递浮点数(如果我能得到它们的话!!)但我需要先对数组进行一些计算。

但总而言之,对于初学者来说,我只需要将字符串中的值转换为浮点数组,例如

x[] = {4519.8081, 4519.8081, 4519.8082, 4519.8083}
y[] = {1426.5819, 1426.5818, 1426.5815, 1426.5812}

如果有更好的方法来完成我所需要的,欢迎评论。

我希望这些信息足以解决我的问题。提前致谢!

我会这样做:

char *input_string = "..."; // Assume properly null terminated.
float y[N]; // Assume some maximum capacity or if N known.
float x[N]; // Probably allocated using malloc here if N large
float num;
int ind = 0;
while (1) {
    // Assume the string does not start with a new line.
    int n_read = sscanf(input_string, "%f%f", &y[ind], &x[ind]);
    if (n_read != 2) {
        // EOF or bad read
        break;
    }

    ind++;

    if (ind >= N) {
       // Too many floats to fit in array.
       break;
    }

    // Move past the next newline.
    input_string = strchr(input_string, '\n');
    if (input_string == NULL) {
        break;
    }

    input_string++;
}

它未经测试,也不是超级干净,但应该足以让您入门。还请记住,正如 Weather Vane 指出的那样,浮点数不能准确表示所有值。也许您可以根据您的用例考虑定点。

如果您不知道字符串中的行数并且不想有最大数组长度,您可以预扫描字符串然后 malloc 一个您需要的精确大小的数组。

首先通过

创建数据文件
cat > data.txt <<EOF1
> 4519.8081,01426.5819
> 4519.8081,01426.5818
> 4519.8082,01426.5815
> 4519.8083,01426.5812
> EOF1

然后创建如下C文件

#include <stdio.h>
#define NUM_ITEMS 10

int main() {

    float y[NUM_ITEMS], x[NUM_ITEMS];
    int i = 0;

    while (scanf("%f,%f\n", &y[i], &x[i]) > 0) i++;

    while (i>0) {
        i--;
        printf("%f %f\n", y[i], x[i]);
    }

    return 0;
}

编译完成后,执行

./a.out < data.txt

程序以相反的顺序创建并打印浮点数组(对应于 y 和 x 坐标)。