Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何正确初始化多维字符数组并将其传递给函数?_C++_Multidimensional Array_Char - Fatal编程技术网

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, 
             "############"
             "#...#......#"
             "..#.#.####.#"
             "###.#....#.#"
             "#....###.#.."
             "####.#.#.#.#"
             "#..#.#.#.#.#"
             "##.#.#.#.#.#"
             "#........#.#"
             "######.###.#"
             "#......#...#"
             "############");