如何正确初始化multidimentional char数组并将其传递给函数?

时间:2011-04-29 17:17:00

标签: c++ multidimensional-array char

我正在编写一个程序,可以从迷宫中退出。我有一个代表实际迷宫的多元数组。

const int size = 12;
    char maze[ size ][ size ] = {
            "############",
            "#...#......#",
            "..#.#.####.#",
            "###.#....#.#",
            "#....###.#..",
            "####.#.#.#.#",
            "#..#.#.#.#.#",
            "##.#.#.#.#.#",
            "#........#.#",
            "######.###.#",
            "#......#...#",
            "############",
        };

VS C ++给了我一条警告信息,说这个数组的大小太小了。我想这是因为每一行都必须有'\ 0'符号。如何在没有'\ 0'符号的情况下初始化char数组?我不想用值13初始化size,因为它太混乱了,不能将这个常量用于函数(打印数组,移动等)。有什么方法可以做到吗?

另外,如何使用指针传递此数组到函数void mazeTraverse

int main()
{
  mazetraverse(maze)
}

void mazeTraverse(char (*maze)[ size ])

此类代码不起作用......

4 个答案:

答案 0 :(得分:3)

您需要在字符串末尾考虑NULL字符:

char maze[size][size + 1] = { /*  */ };

或者,为了获得更大的灵活性,您可以:

char *maze[size] = { /*  */ };

我看到你正在使用C ++。您有没有理由不使用std::string

std::string maze[size] = { /*  */ };

它更灵活;现在你只需将原型更改为:

void mazeTraverse(std::string maze[]);

如果你更疯狂,你将使用std::vector<std::string>


编辑:我建议您学习一下std::string。它就像char*一样工作,但您不必手动分配它/ etc。例如:

std::string mystring = "lol";
mystring = "lololol"; // perfectly legal!

std::cout << mystring[0] << "\n";
// Or: printf("%c\n", mystring[0]);

char* sz[8];
strcpy(sz, mystring[0].c_str());

// And so on...

答案 1 :(得分:2)

只要您使用C ++,为什么不只是制作一个简单的类?:

class Maze {
  public:
    Maze(int width, const std::string& data) 
      :width_(width),
       data_(data.begin(), data.end()) {
    }

    char operator()(int row, int column) const { 
      return data_[width_*row + column]; 
    }

  private:
    int width_;
    std::vector<char> data_;
};

您可以通过利用后续字符串文字(如“foo”“bar”)隐式连接到“foobar”这一事实来轻松初始化它:

Maze my_maze(12, 
             "############"
             "#...#......#"
             "..#.#.####.#"
             "###.#....#.#"
             "#....###.#.."
             "####.#.#.#.#"
             "#..#.#.#.#.#"
             "##.#.#.#.#.#"
             "#........#.#"
             "######.###.#"
             "#......#...#"
             "############");

答案 2 :(得分:1)

“不起作用”?代码可以工作。它完美无缺。 (假设编译器允许您使用这些13个字符的字符串文字来初始化大小为12的数组。这实际上是C ++中的一个错误,但是你说你只是得到一个警告)。

mazeTraverse(maze);

将编译并完成你想要它做的事情(我理解它的方式)。在你的情况下究竟什么不起作用? “不起作用”并不是对问题的有意义的描述。

至于摆脱数组初始化中的警告,如果你坚持使用精确大小的数组,你必须按照每个字符的方式初始化它,如

char maze[ size ][ size ] = {
  { '#', '#', '#', ... },
  { ...                },
  // and so on
};

如果你想使用字符串文字,那么正如你自己所说,你必须声明内部子数组的大小

char maze[ size ][ size + 1 ] = {
  "############",
  // and so on
};

并相应地更改函数声明

void mazeTraverse(char (*maze)[ size + 1 ])

答案 3 :(得分:0)

要初始化,我会:

char* maze[ size ] = {
        "############",
        "#...#......#",
        "..#.#.####.#",
        "###.#....#.#",
        "#....###.#..",
        "####.#.#.#.#",
        "#..#.#.#.#.#",
        "##.#.#.#.#.#",
        "#........#.#",
        "######.###.#",
        "#......#...#",
        "############",
    };

要传递参数,您应该能够使用char **。那就是:

void mazeTraverse(char ** param)