包含 char 数组作为成员的 Struct 数组 - C
Array of of Struct containing array of char as members - C
我有这样的结构:
struct vertices{
char x[20];
char y[20];
char z[20];
};
然后在 main 中我有一个这样的结构顶点数组:
struct vertices vert[64];
在我的主函数中加上一个字符数组,如下所示:
char exampleArray[200]="v 23.232000 32.33000 2.03900\nv 9.20900 3.29000 1.0002\n";
所以我想做的是解析这个包含一百多个顶点的大数组,并将每个值存储在相应的结构顶点的 x,y,z char 数组中,稍后我将简单地通过调用转换
float x=atof(vert[1].x)
并画出每一个。
但问题是我无法通过任何方式将原始数组中的字符存储、复制、连接到 x、y、z 数组,我尝试通过 vert[0].x=exampleArray[0], vert[0].x=exampleArray+i
等在不同的像
这样的条件
if(SpaceCount==1)
{
vert[0].x[0]=exampleArray[i];
i++;
}
但这一切都不起作用。
我尝试了很多变体,无法一一列举。
但我想要的是解析 exampleArray,它有我的原始格式的顶点,每个 3D 顶点在它们之间有 spaces,每个顶点以一个 char V 开头,后跟一个 space,第一个点是 X,然后是 space,然后是 Y 点,在 Z 点之后是换行符 \n,然后又是一个 V 表示新的顶点。
字符数组不是通过简单地指向它们来复制的。函数 "strcpy(vert[0].x, &exampleArray[2])" 是必需的,但即便如此,在第一个数字之后也没有紧跟在后面的 '\0' 来指示停止读取的位置。 "memcpy" 不需要 NULL ('\0') 但需要基于空格的长度。
此外,计划使用的 "atof" 操作也需要 NULL 终止符。
我很关心你的 "space planning"。您有 64 个结构副本,每个副本需要 60 个字符(总共 3840 个),但您的 exampleArray 只有 200 个。输入字符串 exampleArray 的数字字符串必须不超过 19 digits/decimals,因为您需要 NULL每个 x/y/z 中的终止符都存在。
这是对代码问题的纯技术评价,但是你的原创post并没有展示更多的应用设计。帮助我们了解您的应用设计,并提供更多建议。
您可以使用 strtok()
和定界符 " \n"
来获取每个部分,然后 strcpy()
将每个标记放入您的结构中。
struct vertices {
char x[20];
char y[20];
char z[20];
};
int main(void)
{
char exampleArray[200] = "v 23.232000 32.33000 2.03900\nv 9.20900 3.29000 1.0002";
char *toStrtokVertex, *token;
char delim[5] = " \n";
struct vertices V[10];
int i = 0;
toStrtokVertex = exampleArray;
while ((token = strtok(toStrtokVertex, delim)) != NULL) {
// ignore the `v`
// get x
if ((token = strtok(NULL, delim)) != NULL) {
strcpy(V[i].x, token);
}
else {
printf("INPUT ERROR\n");
exit(1);
}
// get y
if ((token = strtok(NULL, delim)) != NULL) {
strcpy(V[i].y, token);
}
else {
printf("INPUT ERROR\n");
exit(1);
}
// get z
if ((token = strtok(NULL, delim)) != NULL) {
strcpy(V[i].z, token);
}
else {
printf("INPUT ERROR\n");
exit(1);
}
// switch this to NULL to keep parsing the same string
toStrtokVertex = NULL;
i++;
}
for (int j = 0; j < i; j++) {
printf("V[%d] (%s, %s, %s)\n", j, V[j].x, V[j].y, V[j].z);
}
}
请注意,我修改了您的输入值以符合您的描述。你有
"v 23.232000 32.33000 2.03900\n 9.20900 3.29000 1.0002"
在\n
之后没有v
开始下一个顶点,所以我加了一个v
"v 23.232000 32.33000 2.03900\nv 9.20900 3.29000 1.0002"
我有这样的结构:
struct vertices{
char x[20];
char y[20];
char z[20];
};
然后在 main 中我有一个这样的结构顶点数组:
struct vertices vert[64];
在我的主函数中加上一个字符数组,如下所示:
char exampleArray[200]="v 23.232000 32.33000 2.03900\nv 9.20900 3.29000 1.0002\n";
所以我想做的是解析这个包含一百多个顶点的大数组,并将每个值存储在相应的结构顶点的 x,y,z char 数组中,稍后我将简单地通过调用转换
float x=atof(vert[1].x)
并画出每一个。
但问题是我无法通过任何方式将原始数组中的字符存储、复制、连接到 x、y、z 数组,我尝试通过 vert[0].x=exampleArray[0], vert[0].x=exampleArray+i
等在不同的像
if(SpaceCount==1)
{
vert[0].x[0]=exampleArray[i];
i++;
}
但这一切都不起作用。
我尝试了很多变体,无法一一列举。 但我想要的是解析 exampleArray,它有我的原始格式的顶点,每个 3D 顶点在它们之间有 spaces,每个顶点以一个 char V 开头,后跟一个 space,第一个点是 X,然后是 space,然后是 Y 点,在 Z 点之后是换行符 \n,然后又是一个 V 表示新的顶点。
字符数组不是通过简单地指向它们来复制的。函数 "strcpy(vert[0].x, &exampleArray[2])" 是必需的,但即便如此,在第一个数字之后也没有紧跟在后面的 '\0' 来指示停止读取的位置。 "memcpy" 不需要 NULL ('\0') 但需要基于空格的长度。
此外,计划使用的 "atof" 操作也需要 NULL 终止符。
我很关心你的 "space planning"。您有 64 个结构副本,每个副本需要 60 个字符(总共 3840 个),但您的 exampleArray 只有 200 个。输入字符串 exampleArray 的数字字符串必须不超过 19 digits/decimals,因为您需要 NULL每个 x/y/z 中的终止符都存在。
这是对代码问题的纯技术评价,但是你的原创post并没有展示更多的应用设计。帮助我们了解您的应用设计,并提供更多建议。
您可以使用 strtok()
和定界符 " \n"
来获取每个部分,然后 strcpy()
将每个标记放入您的结构中。
struct vertices {
char x[20];
char y[20];
char z[20];
};
int main(void)
{
char exampleArray[200] = "v 23.232000 32.33000 2.03900\nv 9.20900 3.29000 1.0002";
char *toStrtokVertex, *token;
char delim[5] = " \n";
struct vertices V[10];
int i = 0;
toStrtokVertex = exampleArray;
while ((token = strtok(toStrtokVertex, delim)) != NULL) {
// ignore the `v`
// get x
if ((token = strtok(NULL, delim)) != NULL) {
strcpy(V[i].x, token);
}
else {
printf("INPUT ERROR\n");
exit(1);
}
// get y
if ((token = strtok(NULL, delim)) != NULL) {
strcpy(V[i].y, token);
}
else {
printf("INPUT ERROR\n");
exit(1);
}
// get z
if ((token = strtok(NULL, delim)) != NULL) {
strcpy(V[i].z, token);
}
else {
printf("INPUT ERROR\n");
exit(1);
}
// switch this to NULL to keep parsing the same string
toStrtokVertex = NULL;
i++;
}
for (int j = 0; j < i; j++) {
printf("V[%d] (%s, %s, %s)\n", j, V[j].x, V[j].y, V[j].z);
}
}
请注意,我修改了您的输入值以符合您的描述。你有
"v 23.232000 32.33000 2.03900\n 9.20900 3.29000 1.0002"
在\n
之后没有v
开始下一个顶点,所以我加了一个v
"v 23.232000 32.33000 2.03900\nv 9.20900 3.29000 1.0002"