如何正确初始化多维字符数组并将其传递给函数

How to correctly initialize multidimentional char array and pass it to function?

本文关键字:函数 数组 初始化 何正确 字符      更新时间:2023-10-16

我正在写一个程序,从迷宫中找到出口。我有一个多维数组来表示实际的迷宫。

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 ])