我正在写一个程序,我不断收到错误。该程序从两个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];}
有谁能告诉我我做错了什么?非常感谢任何帮助。
答案 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];
}
注意:
new CmdBufType[c];
这与new char[c][256];
i < c
而不是i <= c - 1
++i
)而不是后缀运算符(i++
)。在这样的简单情况下,这并不重要,因为未使用非递增值,编译器将对其进行优化。但是如果i
是一个对象,比如一个迭代器,那么它确实很重要。