我有这样的结构:
struct vertices{
char x[20];
char y[20];
char z[20];
};
然后在main中我有一个结构顶点数组,如下所示:
struct vertices vert[64];
在我的主函数中加上一个char数组,如下所示:
char exampleArray[200]="v 23.232000 32.33000 2.03900\nv 9.20900 3.29000 1.0002\n";
所以我想做的是解析包含一百个左右顶点的大数组,并将每个值存储在结构顶点的相应x,y,z字符数组中,稍后我将简单地转换为拜访
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顶点之间都有空格,每个顶点以char V开头,后跟空格,第一个点是X,然后是空格然后是Y点,在Z点后面有换行符\ n \ n字符,然后是V表示新的顶点。
答案 0 :(得分:1)
您可以使用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"
在v
开始下一个顶点之后没有\n
,所以我添加了v
"v 23.232000 32.33000 2.03900\nv 9.20900 3.29000 1.0002"
答案 1 :(得分:0)
只需指向字符数组即可复制字符数组。函数&#34; strcpy(vert [0] .x,&amp; exampleArray [2])&#34;需要,但即使这样,也没有&#39; \ 0&#39;紧接在第一个数字后面,指示在哪里停止阅读。 &#34; memcpy的&#34;不需要NULL(&#39; \ 0&#39;)但需要基于空格的长度。
此外,&#34; atof&#34;计划使用的操作也需要一个NULL终止符。
我关心你的空间规划&#34;。你有64个结构副本,每个结构需要60个字符(总共3840个),但是你的exampleArray只有200个。输入字符串exampleArray的数字字符串必须不超过19位/小数,因为你需要NULL终结符每个x / y / z都存在。
这是代码问题的纯技术评估,但您的原始帖子并未显示更多应用程序设计。帮助我们了解您的应用程序设计,并提供更多建议。