2

さて、ここに私が問題を抱えている私のコードの部分があります:

char * historyArray;
historyArray = new char [20];

//get input
cin.getline(readBuffer, 512);       
cout << readBuffer <<endl;

//save to history
for(int i = 20; i > 0; i--){
    strcpy(historyArray[i], historyArray[i-1]); //ERROR HERE//  
}

strcpy(historyArray[0], readBuffer); //and here but it's the same error//

私が受け取っているエラーは次のとおりです。

"invalid conversion from 'char' to 'char*' 
           initializing argument 1 of 'char* strcpy(char*, const char*)'

このプロジェクトは、割り込みをキャッチして処理し、基本的なUNIXコマンドを実行する疑似OSシェルを作成することです。私が抱えている問題は、過去20個のコマンドを、スタックに動的に割り当てられた文字配列に格納する必要があることです。(また、割り当て解除)

2D文字配列を使用する場合、上記のコードは正常に機能します。

char historyArray[20][];

しかし、問題はそれが動的ではないということです...

そして、はい、strcpyが文字列のコピーに使用されることになっていることを私は知っています。

どんな助けでも大歓迎です!

4

7 に答える 7

7

historyArray20 の配列 (の最初の要素) を指しcharます。その配列に格納できる文字列は 1 つだけです。

C では、char**オブジェクトを作成し、それがオブジェクトの配列の最初の要素を指すようにすることができますchar*。ここで、各要素は文字列を指します。これがargv引数 tomain()が行うことです。

vectorしかし、C++ を使用しているので、 ofを使用stringしてライブラリにメモリ管理を任せる方がはるかに理にかなっています。

于 2011-09-27T21:33:16.103 に答える
1

C++ プログラムでの C イディオムの使用をやめる:

std::deque<std::string> historyArray;

//get input
std::string readBuffer;
std::getline(std::cin, readBuffer);       
std::cout << readBuffer << std::endl;

//save to history
historyArray.push_front(readBuffer);
if(historyArray.size() > 20)
  historyArray.pop_back();

その結果、次のようになります。

  • readBuffer / getline() にバッファオーバーフローの脅威がない
  • 私たちを混乱させるポインターはどこにもありません。
  • 端を超える配列はありません
  • 任意の長さの入力文字列
  • 自明に証明されたメモリ割り当てのセマンティクス
于 2011-09-27T21:49:34.593 に答える
1

2 つのソリューション。1 つ目は、何らかの理由で本当に配列が必要な場合です。もう 1 つは、s を使用することをお勧めしますstd::string

char * historyArray[20]; // Create an array of char pointers

// ...

historyArray[i] = new char[SIZE]; // Do this for each element in historyArray

strcpy次に、 の要素で使用できますhistoryArray

私が繰り返す2番目の解決策をお勧めします(他にもいくつか修正しました):

string historyArray[20];

getline(cin, readBuffer); // Make readbuffer an std::string as well
cout << readBuffer << endl;

for(int i = 19; i > 0; i--){ // I think you meant 19 instead of 20
    historyArray[i] = historyArray[i-1];
}

historyArray[0] = readBuffer;
于 2011-09-27T21:35:38.323 に答える
0

historyArray[i]はcharです。単文字です。あなたは刺し傷を使いたいです。基本的な問題は、historyArrayがchar*文字を含むメモリ範囲を指していることを意味することです。char**文字列へのポインタへのポインタであるaにする必要があります。初期化コードは次のようになります

char** historyArray;
historyArray = new char* [20];
for (int i = 0; i < 20; i++)
{
    historyArray[i] = new char [512];  //Big enough to have a 512 char buffer copied in
}
于 2011-09-27T21:37:10.977 に答える
0

エラー 1: i が 20 に設定されている配列の境界を超えてインデックスを作成しています。

エラー 2: historyArray[i] は char * ではなく char です。&historyArray[i] が必要です。

于 2011-09-27T21:32:54.117 に答える
0
strcpy(&historyArray[i], &historyArray[i-1]);

配列表記は参照を提供しますが、strcopy はポインターを必要とします。アドレス オブ (&) 演算子を使用して参照をポインターに変換します。

于 2011-09-27T21:33:19.963 に答える
0
char * historyArray;
historyArray = new char [20];

//get input
cin.getline(readBuffer, 512);       
cout << readBuffer <<endl;

//save to history
for(int i = 20; i > 0; i--){
   strcpy(&(historyArray[i]), &(historyArray[i-1])); //ERROR HERE//  
}

strcpy(historyArray, readBuffer); //and here but it's the same error//

ただし、これはコンパイル エラーのみを修正し、コード内の論理エラーは修正しません。C++ を使用しているため、文字列ソリューション:

vector<string> history;

cin.getline(readBuffer,512);

history.push_back(readBuffer);

または、readBuffer からのすべてを含む 1 つの長い文字列が必要な場合:

string history;

cin.getline(readBuffer,512);
history = history += string(readBuffer);

例えば...

于 2011-09-27T21:53:22.903 に答える