C++ 如何正确初始化多维字符数组并将其传递给函数?
我正在写一个从迷宫中找到出口的程序。我有一个代表实际迷宫的多维数组C++ 如何正确初始化多维字符数组并将其传递给函数?,c++,multidimensional-array,char,C++,Multidimensional Array,Char,我正在写一个从迷宫中找到出口的程序。我有一个代表实际迷宫的多维数组 const int size = 12; char maze[ size ][ size ] = { "############", "#...#......#", "..#.#.####.#", "###.#....#.#", "#....###.#..", "####.#.#
const int size = 12;
char maze[ size ][ size ] = {
"############",
"#...#......#",
"..#.#.####.#",
"###.#....#.#",
"#....###.#..",
"####.#.#.#.#",
"#..#.#.#.#.#",
"##.#.#.#.#.#",
"#........#.#",
"######.###.#",
"#......#...#",
"############",
};
VC++给了我一个警告信息,说这样的数组太小了。我想这是因为每一行中都必须有“\0”符号。如何在没有“\0”符号的情况下初始化字符数组?我不想用值13初始化
size
,因为在函数(打印数组、移动等)中使用此常量会太混乱。有什么方法可以这样做吗
另外,如何使用指针将此数组传递给函数void mazeTraverse
int main()
{
mazetraverse(maze)
}
void mazeTraverse(char (*maze)[ size ])
这样的代码不起作用…“不起作用”?代码确实有效。它工作得非常好。(假设编译器允许你使用这13个字符串字符串来初始化大小为12的数组。这实际上是C++中的一个错误,但你说你得到的只是一个警告)。
这个
将编译并执行您希望它执行的操作(按照我的理解)。在你的情况下,什么东西不起作用?“不起作用”并不是对问题的有意义的描述
至于消除数组初始化中的警告,如果您坚持使用精确大小的数组,则必须按照中的每个字符方式对其进行初始化
char maze[ size ][ size ] = {
{ '#', '#', '#', ... },
{ ... },
// and so on
};
如果您想使用字符串文字,那么正如您自己所指出的,您必须声明大小更大的内部子数组
char maze[ size ][ size + 1 ] = {
"############",
// and so on
};
并相应地更改函数声明
void mazeTraverse(char (*maze)[ size + 1 ])
要初始化,我将:
char* maze[ size ] = {
"############",
"#...#......#",
"..#.#.####.#",
"###.#....#.#",
"#....###.#..",
"####.#.#.#.#",
"#..#.#.#.#.#",
"##.#.#.#.#.#",
"#........#.#",
"######.###.#",
"#......#...#",
"############",
};
要传递参数,您应该能够使用char**。这就是:
void mazeTraverse(char ** param)
您需要考虑字符串末尾的空字符:
char maze[size][size + 1] = { /* */ };
或者,为了获得更大的灵活性,您可以执行以下操作:
char *maze[size] = { /* */ };
我看到你在使用C++。您没有使用
std::string
有什么原因吗
std::string maze[size] = { /* */ };
它更加灵活;现在您只需将原型更改为:
void mazeTraverse(std::string maze[]);
如果你更疯狂,你会使用std::vector
编辑:我建议学习一下。它就像一个
char*
一样工作,但您不必手动分配它/等等。例如:
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...
std::string mystring=“lol”;
mystring=“lololol”//完全合法!
STD::CUT只要你使用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_;
};
提醒我函数名是mazeTraverse
。为什么要调用mazetraverse
?请注意,引号后面(在“数组”中)没有任何逗号。@lidjam:不,我肯定是指操作符()。运算符[]只允许一个参数;我们需要两个(即行和列)。@muntoo:没错。让大家都明白一点:把字符串文本放在一起而不加逗号就相当于写出一个巨大的字符串。构造函数接受这个const char*并隐式地将其转换为std::string,然后可以轻松地将其复制到内部表示形式:不需要空终止字符的std::vector。您的示例对我来说太难理解了。我很熟悉类的基础,但现在我还不知道诸如:width(width)、data(data.begin()、data.end())和std::string之类的内容。@SuperElectric:如果你是说operator()
,那么签名应该是char operator()(int row,int column)const
。您的代码缺少一个关键部分,即您正在定义的运算符。非常感谢!你的例子很好用。我没有使用C++风格的字符串,因为我还没有学会。“现在我的注意力集中在C风格的字符串上。”Alex对我的答案做了一些编辑。
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_;
};
Maze my_maze(12,
"############"
"#...#......#"
"..#.#.####.#"
"###.#....#.#"
"#....###.#.."
"####.#.#.#.#"
"#..#.#.#.#.#"
"##.#.#.#.#.#"
"#........#.#"
"######.###.#"
"#......#...#"
"############");