错误:初始化时无法将字符 (*)[] 转换为字符**'
Error: cannot convert char (*)[] to char**' in initialization
>我正在编写一个程序,其中不断出现错误。该程序从两个txt文件中读取数据,并在排序后将其打印出来。当我尝试使用指针到指针读取字符数组时遇到问题,如下所示:
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];}
谁能告诉我我哪里做错了?任何帮助将不胜感激。
二维数组(矩阵)不是指针数组。
表达式 new char[c][256]
分配一个二维数组,一个由 c
个一维数组组成的数组,每个数组的大小为 256。结果是指向第一个此类项的指针,即char(*)[256]
。
相反,您尝试初始化的指针变量的类型为 char**
,它是指向 char
的指针。通常,这是指向指向char
的指针数组中第一项的指针。该结构与您分配的内容不匹配。
二维数组称为矩阵。
在 C 和 C++ 原始数组的上下文中,默认情况下,此术语意味着数组数组。
指向数组的指针数组称为交错数组,因为它可以具有(指向)不同大小的数组。 例如,值围绕对角线对称的数学矩阵可以存储在大小为 1、2、3 等的数组中。在某些情况下,交错数组也用于实现方形数学矩阵。
一个好的解决方案是使用string
vector
代替原始数组:
vector<string> commands;
这样,您甚至不必预先指定大小。
用户不必指定大小,您只需push_back
每个新命令即可。
此处vector
从<vector>
标头std::vector
,string
从<string>
标头std::string
。
对于读取命令,您可以使用 std:.getline
,也可以从 <string>
标头读取,这样可以避免一次只读取一个以空格分隔的"单词":它一次读取一整行。
试试这个:
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];
}
笔记:
- 你也可以写
new CmdBufType[c];
这与new char[c][256];
相同 - 最好写
i < c
而不是i <= c - 1
- 首选前缀运算符 (
++i
) 而不是后缀运算符 (i++
)。在像这样的简单情况下,这无关紧要,因为不使用非递增值,编译器会对其进行优化。但是,如果i
是一个对象,比如一个迭代器,那么它确实很重要。
相关文章:
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- 尝试将字符串/字符转换为整数会产生意外结果
- 如何使用C++将字符串中的字符转换为整数变量
- 字符转换功能 std::isupper() & std::islower() C++17
- 将字符 * 转换为字符串 *
- 在编译时将常量字符* 转换为常量 char_type*
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 错误:请求从"常量字符 [5]"转换为非标量类型"字符串"
- 无法使用字符串流将字符转换为字符串C++
- 将无符号字符 C++ 转换为 C#
- C++:使用没有位移位的指针将无符号字符转换为无符号 int
- 为什么我可以隐式地将字符*转换为常量字符*,但不能将无符号字符*
- 无法<string>从"常量字符 []"转换为<类名>
- 不能将字符转换为整数吗?
- 编译时将字符*转换为字节
- CP1251:从字符* 转换为 wchar_t* 时的编码失真
- 将单个字符转换为 std::string 前缀 \x01
- PPM 将字符转换为 int 授予负数
- 通过像printf这样的可变参数函数传递一个带有常量字符*转换函数的类
- 将常量字符* 转换为字符时出错