我正在编写一个程序,可以从迷宫中退出。我有一个代表实际迷宫的多元数组。
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 ])
此类代码不起作用......
答案 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)