0
string result="CCY 1.2597 Down 0.0021(0.16%) 14:32 SGT [44]";
char* token;
char* buffer[result.length() + 1];  //Space for '\0'

strcpy(buffer, result.c_str());
buffer[result.length()] = '\0';     //insert '\0'
token = strtok(buffer, " ");
while (token != NULL) {
  /* work with token */
  token = strtok(NULL, " ");
}

上記のコードでエラーが発生した理由がわかりません。コードの何が問題なのですか

main.cpp:51:30: error: cannot convert ‘char**’ to ‘char*’ for argument ‘1’ to ‘char* strcpy(char*, const char*)’
main.cpp:53:27: error: cannot convert ‘char**’ to ‘char*’ for argument ‘1’ to ‘char* strtok(char*, const char*)’
make: *** [main.o] Error 1

BUILD FAILED (exit value 2, total time: 893ms)
4

4 に答える 4

4

コードには 2 つの問題があります。まず、変数の型bufferが間違っています。これは、コンパイラが検出したエラーです。第 2 に、gcc の非標準可変長配列 (VLA) 拡張を使用することで、(おそらく無意識のうちに) C++ 標準から逸脱しています。この機能は、C99 以降の C では標準ですが、C++ では標準ではありません。

変数宣言については、次の行が間違っています。

char* buffer[result.length() + 1];

この行は、スタック上の文字へのポインターの配列を割り当てます。ただし、strcpy文字ベクトルへの単一のポインターが必要です。配列型 ( などchar[]) はポインター ( char*) に崩壊しますが、文字へのポインターの配列 ( char*[]) は に崩壊しchar**ます。これは、1 つのポインターが多すぎます。代わりに次のように宣言します。

char buffer[result.length() + 1];

現在、これはまだgcc でのみコンパイルされます。コードに互換性を持たせるには、メモリ割り当てを動的にする必要があります。たとえば、次を使用します。

char *buffer = new char[result.length() + 1];

そして実行する

delete[] buffer;

あなたのルーチンの終わりに。std::unique_ptrここでの作業を楽にするために、スマート ポインター ( ) を使用する必要があります。

于 2012-07-24T11:07:34.917 に答える
1

あなたの定義

char* buffer[result.length() + 1]; 

間違っている。

char* buffer = new char[result.length() + 1];

動的メモリ割り当てで c-string を初期化する必要があります。

于 2012-07-24T11:07:54.123 に答える
0

であってはbufferなりませんがchar*、ただchar

文字を指すのではなく、文字が含まれます。

于 2012-07-24T11:04:55.383 に答える
0

オフ宣言bufferは間違っています。「*」を取り除きます。そのはず

char buffer[result.length() + 1]; 
于 2012-07-24T11:05:29.177 に答える