1
char *dum[32];
strcpy(&dum,InstList->Lines->Text.c_str());

InstListTMemoC++ Builder の

このエラーが発生するのはなぜですか?

[C++ エラー] emulator.cpp(59): E2034 'char * *' を 'char *' に変換できません 完全なパーサー コンテキスト emulator.cpp(56): 解析中: void _fastcall TMain::Button1Click(TObject *)

4

4 に答える 4

2
char *dum[32];

長さ 32 の配列で、各要素はchar*です。私はあなたが書くつもりだったと思います

char dum[32];

これは 32 文字の配列で、次のように記述できます。

strcpy(dum, InstList->Lines->Text.c_str());

もちろん、InstList->Lines->Textバッファがオーバーフローするほど大きくないことを確認してください。

もちろん、C++ プログラムで C 文字列を使用する必要がある理由はわかりません。

于 2011-10-29T11:49:49.117 に答える
2

どちらかを使用します(バッファオーバーフローと呼ばれる深刻なセキュリティ問題が発生する傾向があります)

char dum[32];
strcpy(dum,InstList->Lines->Text.c_str());

または (バッファ オーバーフローと呼ばれる重大なセキュリティ上の問題が発生する傾向がなく、任意の長さで動作するため、はるかに優れています)

// C style
// char *dum = malloc(strlen(InstList->Lines->Text.c_str())+1); 

// BCB style...
char *dum = malloc(InstList->Lines->Text.Length()+1);  

// BEWARE: AFTER any malloc you should check the pointer returned for being NULL

strcpy(dum,InstList->Lines->Text.c_str());

編集 - コメントによると:

古いバージョンの BCB をまだ使用していると仮定しています。AnsiStringこれが新しいバージョンUnicodeStringの場合、Unicode 文字列は 1 文字あたり複数バイトを占めるため (エンコーディングなどに応じて)、コードが「奇妙な結果」につながる可能性があります。

于 2011-10-29T11:51:07.123 に答える
1
チャーダム[32];   
strcpy(dum,InstList->Lines->Text.c_str());
于 2011-10-29T11:49:26.130 に答える
1

または代わりにchar*使用しないでください。何らかの理由で文字列へのポインタが必要な場合は、文字列オブジェクトからこれを取得してください。Stringstd::string

String myString = InstList->Lines->Text;
myString.c_str();
于 2011-10-29T12:01:54.197 に答える