包含char数组作为成员的Struct数组 - C [关闭]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了包含char数组作为成员的Struct数组 - C [关闭]相关的知识,希望对你有一定的参考价值。

我有这样的结构:

struct vertices{
                  char x[20];
                  char y[20];
                  char z[20];
                 };

然后在main中我有一个结构顶点数组,如下所示:

struct vertices vert[64];

加上我的main函数中的char数组,如下所示:

char exampleArray[200]="v 23.232000 32.33000 2.03900
v 9.20900 3.29000 1.0002
";

所以我想做的是解析包含一百个左右顶点的大数组,并将每个值存储在结构顶点的相应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作为新的顶点。

答案

您可以使用strtok()和分隔符" "来获取每个部分,然后使用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
v 9.20900 3.29000 1.0002";
    char *toStrtokVertex, *token;
    char delim[5] = " 
";
    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
");
            exit(1);
        }

        // get y
        if ((token = strtok(NULL, delim)) != NULL) {
            strcpy(V[i].y, token);
        }
        else {
            printf("INPUT ERROR
");
            exit(1);
        }

        // get z
        if ((token = strtok(NULL, delim)) != NULL) {
            strcpy(V[i].z, token);
        }
        else {
            printf("INPUT ERROR
");
            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)
", j, V[j].x, V[j].y, V[j].z);
    }
}

请注意,我修改了您的输入值以符合您的描述。你有过

"v 23.232000 32.33000 2.03900
 9.20900 3.29000 1.0002"

v开始下一个顶点之后没有 ,所以我添加了一个v

"v 23.232000 32.33000 2.03900
v 9.20900 3.29000 1.0002"
另一答案

只需指向它们即可复制字符数组。需要函数“strcpy(vert [0] .x,&exampleArray [2])”,但即使这样,在第一个数字后面也没有' 0'来指示停止读取的位置。 “memcpy”不需要NULL(' 0')但需要基于空格的长度。

此外,计划使用的“atof”操作也需要NULL终止符。

我关心你的“太空计划”。你有64个结构副本,每个结构需要60个字符(总共3840个),但是你的exampleArray只有200个。输入字符串exampleArray的数字字符串必须不超过19位/小数,因为你需要NULL终结符每个x / y / z都存在。

这是对代码问题的纯技术评估,但您的原始帖子并未显示更多的应用程序设计。帮助我们了解您的应用程序设计,并提供更多建议。

以上是关于包含char数组作为成员的Struct数组 - C [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

数据结构 -- 结构体Struct

c struct queue error:“数组类型具有不完整的元素类型”

有效地连接左侧的 N 个字符数组,C

C 结构体零散知识点

使用 stl map 作为 struct 的成员

c语言如何解析xml并将所有内容存入数组