如何从一个文件加载3个值到一个char* 数组(C)?

6tqwzwtp  于 2023-06-21  发布在  其他
关注(0)|答案(1)|浏览(87)

我尝试实现一个函数,它打开一个obj文件,从第二个字符开始循环遍历一行中的每个字符,因为第一个和第二个字符只是“v”,代表顶点。不知何故,我得到了一个访问冲突错误。下面是代码:

bool LoadFromObjectFile(char* filepath) {
    FILE* pF;
    fopen_s(&pF, filepath, "r");
    if (pF == NULL)
        return false;

    char buffer[128];

    while (fgets(buffer, sizeof(buffer), pF) != NULL) {
        if (buffer[0] == 'v') {
            int currCoord = 0;
            char* vCoords[3] = { "", "", ""};

            for (int i = 2; i < sizeof(buffer); i++) {
                if (buffer[i] == ' ') {
                    currCoord++;
                    continue;
                }

                strcat_s(vCoords[currCoord], sizeof(&buffer[i]), &buffer[i]);
            }
        }
    }

    printf("%s\n", buffer);
    fclose(pF);

    return true;
}

我尝试使用strcat函数将当前字符添加到其中一个vCoords中。我以为它会立即工作,但我得到一个错误,我不知道为什么。

bprjcwpo

bprjcwpo1#

char* vCoords[3] = { "", "", ""};

你已经得到了一个很好的三个指向字符串字面量的指针数组。

strcat_s(vCoords[currCoord], sizeof(&buffer[i]), &buffer[i]);

您正尝试在此处修改字符串文字。这是不允许的。即使你可以修改一个字符串字面量,你不能,你使用的sizeof(&buffer[i]) * 在几个级别上是完全错误的 *,你的字符串字面量 * 足够大,可以包含一个空字符串,没有其他东西 *。
实际上根本不清楚你想做什么。循环似乎没有任何可见的效果。你只需要在循环后打印文件的最后一行。这就是你的功能所做的一切。
如果你想从每一行中取出三个空格分隔的标记,你可以用strtok函数来完成,近似方式如下(警告,未经测试的代码):

char vCoords[3][128];
char* start = buffer + 2;
char* token = strtok(buffer, " ");
for (int token_idx = 0; token_idx < 3 && token != NULL, ++token_idx)
{
   strcpy(vCoords[token_idx], token);
   token = strtok(NULL, " ");
}

当然,你想用vCoords做一些事情,否则你可以用一对空的大括号替换这个函数。

相关问题