如何正确初始化多维字符数组并将其传递给函数
How to correctly initialize multidimentional char array and pass it to function?
我正在写一个程序,从迷宫中找到出口。我有一个多维数组来表示实际的迷宫。
const int size = 12;
char maze[ size ][ size ] = {
"############",
"#...#......#",
"..#.#.####.#",
"###.#....#.#",
"#....###.#..",
"####.#.#.#.#",
"#..#.#.#.#.#",
"##.#.#.#.#.#",
"#........#.#",
"######.###.#",
"#......#...#",
"############",
};
VS c++给了我一个警告消息,说对于这样的数组size太小了。我猜这是因为每行中也必须有" "符号。我如何初始化字符数组没有' '符号?我不想初始化值为13的size
,因为它会太混乱使用这个常量函数(打印数组,移动等)有什么办法吗?
另外,如何通过这个数组函数void mazeTraverse
使用指针?
int main()
{
mazetraverse(maze)
}
void mazeTraverse(char (*maze)[ size ])
您需要考虑字符串末尾的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>
。
EDIT:我建议学习一些关于std::string
的知识。它的工作原理就像char*
,但你不必手动分配它/等。例如:
std::string mystring = "lol";
mystring = "lololol"; // perfectly legal!
std::cout << mystring[0] << "n";
// Or: printf("%cn", mystring[0]);
char* sz[8];
strcpy(sz, mystring[0].c_str());
// And so on...
既然你在用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,
"############"
"#...#......#"
"..#.#.####.#"
"###.#....#.#"
"#....###.#.."
"####.#.#.#.#"
"#..#.#.#.#.#"
"##.#.#.#.#.#"
"#........#.#"
"######.###.#"
"#......#...#"
"############");
要初始化,我将:
char* maze[ size ] = {
"############",
"#...#......#",
"..#.#.####.#",
"###.#....#.#",
"#....###.#..",
"####.#.#.#.#",
"#..#.#.#.#.#",
"##.#.#.#.#.#",
"#........#.#",
"######.###.#",
"#......#...#",
"############",
};
要传递参数,应该能够使用char**。也就是:
void mazeTraverse(char ** param)
"行不通"?代码可以工作。它工作得很好。(假设编译器允许您使用那些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 ])
相关文章:
- 第 i 个元素返回 i 的函数数组
- 使用嵌套函数数组是个好主意吗?
- 正确实现类函数数组
- 试图引用已删除函数数组的相等运算符
- 如何在静态函数中使用成员函数数组
- 无法创建函数数组
- 构造函数数组
- 使用开关或定义函数数组 - 更快
- 编写一个函数,该函数将覆盖主函数数组中的值
- 可以像'funs[1]();'一样调用的函数数组
- std::AVX内部函数数组
- 如果数组大小未知,如何将函数数组作为参数传递
- 从函数数组中获取值
- 使用元编程在编译时初始化函数数组
- 将C函数数组转换为C++函数指针数组
- 复制构造函数 [数组] C++
- 添加函数数组并随机选择其中一个
- 指针到私有成员函数数组
- 可以单独声明函数数组的元素
- (c++)将main中的随机值保存到函数数组中