【问题标题】:Array of of Struct containing array of char as members - C [closed]包含char数组作为成员的结构数组-C [关闭]
【发布时间】:2018-02-27 22:26:45
【问题描述】:

我有一个这样的结构:

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 字符数组中,稍后我将简单地转换为呼唤 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 字符,然后是新顶点的 V。

【问题讨论】:

  • vert[0].xchar[20]exampleArray[0]char。我认为您正在尝试复制字符串,在这种情况下您需要使用类似 strcpy
  • 您可以使用 strcpy 将一个 char 数组复制到另一个。并将字符串拆分为数组使用 strtoken
  • 我试过 strcat、strcpy 等......这就是问题所在,我只是想解析 exampleArray 并从中获取 X、Y、Z 点,然后将它们复制到 Vert[0] .x 或 Vert[1].X 或 Vert[2].Y 等,我知道 exampleArray[i] 是一个 Char 但它在一个循环内,这意味着我正在尝试将一个字符一个字符地复制到 vert[0 ].x 例如。
  • 您到底尝试了什么,又是如何失败的?
  • 您的exampleArray 内容与您对格式的描述不符。

标签: c arrays linux char wavefront


【解决方案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"

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

"v 23.232000 32.33000 2.03900\nv 9.20900 3.29000 1.0002"

【讨论】:

  • 非常感谢,这正是我所需要的。我很累,无法写出一个解释清楚的问题,我什至没有精力从我的程序中复制代码示例,但你知道我想要做什么。谢谢(y)
【解决方案2】:

字符数组不会通过简单地指向它们来复制。需要函数“strcpy(vert[0].x, &exampleArray[2])”,但即便如此,在第一个数字之后也没有'\0'来指示停止读取的位置。 "memcpy" 不需要 NULL ('\0'),但需要基于空格的长度。

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

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

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

【讨论】:

  • 这些只是例子,实际数据比这个大很多,空间被照顾,我也不担心 atof...一切正常...唯一的问题我'我面临的问题是我无法解析示例数组以逐个字符 x、y、z 点将字符复制到它们相应的数组中,该数组是其中包含 x、y、z char 数组的结构顶点。
猜你喜欢
  • 2016-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多