错误:无法在初始化时将char(*)[]转换为char **'

时间:2016-01-23 23:18:23

标签: c++ pointers char

我正在写一个程序,我不断收到错误。该程序从两个txt文件中读取数据,并在排序后将其打印出来。当我尝试使用指针指向读取char数组时,我有问题,如下所示:

int c;
cin >> c;

char** commands =  new char[c][256];  //first array read one complete line, and the second one read the array(data) of the lines

for(int i = 0; i <= c - 1; i++){
    cin >> commands[i];}

有谁能告诉我我做错了什么?非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

二维数组(矩阵)不是指针数组。

表达式new char[c][256]分配一个二维数组,一个c个一维数组的数组,每个数组大小为256.结果是指向第一个这样的项的指针,即{{1 }}

相反,您尝试初始化的指针变量是char(*)[256]类型,它是指向char**的指针。通常,这是指向char指针数组中第一项的指针。该结构与您分配的内容不匹配。

二维数组称为矩阵

在C和C ++原始数组的上下文中,默认情况下,该术语表示数组数组。

指向数组的指针数组称为锯齿状数组,因为它可以具有(指向)不同大小的数组。例如,其值在对角线周围对称的数学矩阵可以存储在大小为1,2,3等的阵列中。在某些情况下,锯齿状数组也用于实现平方数学矩阵。

一个好的解决方案是使用char vector代替原始数组:

string

这样您甚至不必预先指定尺寸。

用户不必指定大小,每个新命令只需vector<string> commands;

此处push_back vector标题为std::vector<vector>标题为string std::string

对于读取命令,您可以使用<string>,也可以使用std:.getline标题,这样可以避免一次仅读取一个以空格分隔的“单词”:它一次读取整行。

答案 1 :(得分:0)

试试这个:

int c;
std::cin >> c;

typedef char CmdBufType[256];

CmdBufType* commands = new char[c][256];

for(int i = 0; i < c; ++i)
{
    std::cin >> commands[i];
}

注意:

  1. 您也可以写new CmdBufType[c];这与new char[c][256];
  2. 相同
  3. 更好地写i < c而不是i <= c - 1
  4. 首选前缀运算符(++i)而不是后缀运算符(i++)。在这样的简单情况下,这并不重要,因为未使用非递增值,编译器将对其进行优化。但是如果i是一个对象,比如一个迭代器,那么它确实很重要。