如何将数字存储在结构数组中

nex*_*n99 2 c arrays double struct scanf

嘿,所以我有下面的字符串:

char teststring[50] = "A 1.0 2.0 3.0 4.0";
Run Code Online (Sandbox Code Playgroud)

我有很多这种格式的字符串,我只需要将数字(而不是字母)存储在一起。所有数字都是相关的,因此我一直在尝试制作结构数组,但遇到了一些麻烦。我像这样设置结构(命名为wall.h文件并将其包含在主文件中)

struct example{
    double x1;
    double y1;
    double x2; 
    double y2;
};
Run Code Online (Sandbox Code Playgroud)

然后使用声明14个结构的数组

struct example ex[14];
Run Code Online (Sandbox Code Playgroud)

然后我试图用它来扫描字符串中的值并将它们存储在数组的第一个结构中

sscanf(teststring, "A %f %f %f %f", &ex[0].x1, &ex[0].y1, &ex[0].x2, &ex[0].y2);
Run Code Online (Sandbox Code Playgroud)

但是它似乎不起作用,并告诉我当我打印时该值为0.00000,而不是1.0

Gya*_*ain 5

未定义的行为表现为0.0今天的情况。
用不正确的参数调用scanf是未定义的行为。在您的情况下,您要告诉编译器参数类型float *只是传递而已double *

您应该使用"%lf"阅读double

sscanf(teststring, "A %lf %lf %lf %lf", &ex[0].x1, &ex[0].y1, &ex[0].x2, &ex[0].y2);
/*                    ^^^^^^^^^^^^^^^                                               */
Run Code Online (Sandbox Code Playgroud)

"%f"用于读取(使用scanf功能系列)和打印(使用printf功能系列)float和打印double。(float之所以起作用,是因为可变参数函数中参数的自动提升。从一种类型的指针到另一种类型的指针(例如float *double *)的自动提升是不可能的。)

"%lf"用于阅读和写作double

总结一下:

+--------+--------------+---------------+
|  type  | scanf family | printf family |
+--------+--------------+---------------+
| float  | %f           | %f            | 
+--------+--------------+---------------+
| double | %lf          | %f or %lf     |
+--------+--------------+---------------+
Using %lf in printf to print float would work but can be misleading to other readers
Run Code Online (Sandbox Code Playgroud)