C ++将数据读入char *

时间:2014-04-05 15:30:16

标签: c++ char

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

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循环的第二个中,当{ {1}}和x = 0

任何人都可以解释为什么会发生这种情况,问题是什么?

该计划最终要让y = 4从文件中读取字符串,以便我可以将级别数据存储在单独的文件中。

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

你返回的实际上是一个字符串:在这种情况下,逗号运算符只返回最后一个&#34; aaaaaa ...&#34;元件。要实现您想要的(字符串数组),您至少应该将数据放在数组周围。 (我认为这种方法无论如何都是一种虚方法,因为以这种方式返回硬编码的字符串数组可能是一个值得怀疑的想法:))

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

UPDATE:返回类型应该是指向chararray的指针(或指向指针指向char的指针),以便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();

    ...

答案 1 :(得分:1)

问题是你声明"string","string","string",etc并未声明char *数组。您正在使用逗号运算符,这意味着返回的字符串实际上将是&#34; AAAA ... AA&#34; - 只有26个字节长,所以你最终会引用内存越界。 删除逗号,它应该可以正常工作,因为预处理器将所有字符串行连接成一个长字符串。

答案 2 :(得分:0)

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];
};

最好将const指针返回到上面的内容。