[英]error: cannot convert ‘std::string’ to ‘char*’ in initialization
[英]Error: cannot convert char (*)[] to char**' in initialization
我正在編寫一個程序,但不斷出現錯誤。 該程序從兩個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];}
誰能告訴我我做錯了什么嗎? 任何幫助是極大的贊賞。
二維數組(矩陣)不是指針數組。
表達式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
。
對於讀取命令,您還可以從<string>
標頭使用std:.getline
,這避免了一次僅讀取一個用空格分隔的“單詞”:它一次讀取一整行。
嘗試這個:
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
是一個對象,說一個迭代器,那確實很重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.