C++将数据读入字符*

C++ reading data into a char*

本文关键字:字符 数据 C++      更新时间:2023-10-16

我正在尝试使用以下代码将数据读入字符*:

void MyGameMain::MakeNewTileMap() {
    char* data[] = { GetLevelFromFile() };
    //failing at x = 0 y = 4
    // Set up the tiles
    for (int x = 0; x < 24; x++) {
        for (int y = 0; y < 26; y++) {
            m_oTiles.SetValue(x, y, data[y][x] - 'a');
        }
    }
    //display level in prompt
    for (int y = 0; y < 26; y++) {
        for (int x = 0; x < 24; x++)
            printf("%d ", m_oTiles.GetValue(x, y));
        printf("n");
    }
}

函数 GetLevelFromFile() 如下所示:

char* MyGameMain::GetLevelFromFile() {
return
    "aaaaaaaaaaaaaaaaaaaaaaaa",
    "aaaaaaaaaaaaaaaaaaaaaaaa",
    "aaaaaaaaaaaaaaaaaaaaaaaa",
    "aaaaaaaaaaaaaaaaaaaaaaaa",
    "aaaaaaaaaaaaaaaaaaaaaaaa",
    "aaaaaaaaaaaaaaaaaaaaaaaa",
    "aaaaaaaaaaaaaaaaaaaaaaaa",
    "aaaaaaaaaaaaaaaaaaaaaaaa",
    "aaaaaaaaaaaaaaaaaaaaaaaa",
    "aaaaaabbbbbbbbbbbbaaaaaa",
    "aaaaaaeeeeeeeeeeeeaaaaaa",
    "aaaaaabbbbbbbbebbbaaaaaa",
    "aaadddbbbbbbbbbbbbcccaaa",
    "aaadddbbbbbbbbbbbbcccaaa",
    "aaaaaabbbebbbbbbbbaaaaaa",
    "aaaaaabbbbbbbbbbbbaaaaaa",
    "aaaaaabbbbbbbbbbbbaaaaaa",
    "aaaaaaaaaaaaaaaaaaaaaaaa",
    "aaaaaaaaaaaaaaaaaaaaaaaa",
    "aaaaaaaaaaaaaaaaaaaaaaaa",
    "aaaaaaaaaaaaaaaaaaaaaaaa",
    "aaaaaaaaaaaaaaaaaaaaaaaa",
    "aaaaaaaaaaaaaaaaaaaaaaaa",
    "aaaaaaaaaaaaaaaaaaaaaaaa",
    "aaaaaaaaaaaaaaaaaaaaaaaa",
    "aaaaaaaaaaaaaaaaaaaaaaaa";
}

当我运行此代码时,我收到一个错误,这实质上意味着我正在尝试读取不存在的数据,在第一个嵌套的 for 循环的第二个点,当x = 0y = 4时。

谁能解释为什么会发生这种情况,问题是什么?

最终的计划是让GetLevelFromFile()从文件中读取字符串,以便我可以将级别数据存储在单独的文件中。

感谢您的帮助!

你返回的实际上是一个字符串:在这种情况下,逗号运算符将只返回最后一个"aaaaaa..."元素。要实现您想要的(字符串数组),您至少应该将卷曲放在数组周围。(我认为这种方法无论如何都是一个虚拟方法,因为以这种方式返回字符串的硬编码数组可能是一个有问题的想法:)

char** MyGameMain::GetLevelFromFile() {
return {
    "aaaaaaaaaaaaaaaaaaaaaaaa",
    "aaaaaaaaaaaaaaaaaaaaaaaa",
     ....
    "aaaaaaaaaaaaaaaaaaaaaaaa"
  };
}

更新:返回类型应该是指针到字符数组(或指针到指针到字符),以便char* data[]正确接受它。

后来的更新:实际上我宁愿有一个虚拟数组作为静态类成员(如果它应该是冻结值,则标记为 const):

class MyGameMain {
public:
    void MakeNewTileMap();
    const char** GetLevelFromFile() const;
    static const char* level[];
};
const char* MyGameMain::level[] = {
    "aaaaaaaaaaaaaaaaaaaaaaaa",
    "aaaaaaaaaaaaaaaaaaaaaaaa",
     "aaaaaaaaaaaaaaaaaaaaaaaa"
  };
const char** MyGameMain::GetLevelFromFile() const {
    return level;
}
void MyGameMain::MakeNewTileMap() {
    const char** data = GetLevelFromFile();
    ...

问题是您对"string","string","string",etc的声明没有声明char *数组。您正在使用逗号运算符,这意味着返回的字符串实际上是"AAAA...AA" - 只有 26 个字节长,因此您最终会超出范围引用内存。删除逗号,它应该可以根据需要工作,因为预处理器会将所有字符串行连接成 1 个长字符串。

struct levelbase {
   int x, y;
   unsigned char operator[](_x, _y) {return (unsigned char*)(this+1)+_y*x+_x;};
};
template<int x, int y> struct level : levelbase {
    unsigned char data[x][y];
};

不过,最好返回一个常量指针指向上面的内容。