簡體   English   中英

錯誤:初始化時無法將char(*)[]轉換為char **'

[英]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];
}

筆記:

  1. 您也可以編寫new CmdBufType[c]; 這與new char[c][256];
  2. 最好寫i < c而不是i <= c - 1
  3. 建議使用前綴運算符( ++i )而不是后綴運算符( i++ )。 在這樣的簡單情況下,這並不重要,因為不使用非增量值,編譯器會對其進行優化。 但是,如果i是一個對象,說一個迭代器,那確實很重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM