0

重複の可能性:
C++ での文字列の分割

char *strtok(char *s1, const char *s2)

string必要に応じて a を char*に変換するにはどうすればよいstrtokですか? やった

for (string line; getline(sourceFile, line);) {
    tokens = strtok(line.c_str(), " {};");
}

( )sourceFileはどこですかifstreamsourceFile.open(filepath.c_str());

私は得ています:

タイプ「const char *」の引数は、タイプ「char *」のパラメーターと互換性がありません

4

3 に答える 3

2

他の人が言ったように、おそらく 以外のものを使いたいでしょうstrtok

ただし、あなたが求めていることを行うには(おそらくそうすべきではありません):

for (string line; getline(sourceFile, line);) {
    char* line_cstr = strdup(line.c_str());

    char* token = strtok(line_cstr, " {};");

    while ((token = strtok(NULL, " {};")) != NULL) {
        //code
    }

    free(line_cstr);

}
于 2012-10-23T00:19:46.400 に答える
0

次のようなことをすると:

char fp[40];  // or some reasonable size
strcpy( fp, filepath.c_str()); // fp is not a const char* like c_str() returns

strtok()に対して使用できるはずですfp

ただし、C++文字列を分割する別の方法を検討することもできます。

于 2012-10-23T00:17:14.977 に答える
0

Jonathan Leffler のコメントが説明しているように、strtok は実際にバッファーを変更して、連続するトークンを終了します。これは速度に優れています。各トークンを他のメモリ領域にコピーする手間を省きながら、別の NUL で終了するシーケンスとして簡単にアクセスできるようにします。インスタンスで strtok を使用することが正当かどうかは興味深い質問です。std::string確かに、そのバッファーの一部を上書きすることを意図していないため、c_str()メンバーは a を返します。const char*ただし、空の文字列がない限り (未定義の動作が発生する可能性があります)、 を使用char*して最初の要素に a を取得できます&line[0]。それを行ったら、文字列を変更できますが、オフセットでのみ[0]..[size()-1]...c_str()-returned バッファは、まさにそのため、&line[0]-returned バッファは での使用に適していない可能性がありますstrtok。NUL を追加することもできます (つまり、line += '\0'NUL は合法的なstd::stringコンテンツです) が、コードが少しハック的になり、保守が難しくなります。元の値を何かに使用する予定がある場合は、後で NUL を削除する必要がある場合があります。

本当に を使用したい場合はstrtok、最初に別の書き込み可能な NUL 終端バッファにデータをコピーするのが最善のようです。例えば:

char* p = strdup(line.c_str());
... use strtok on p ...
free(p);

alloca()、スマート ポインター、を使用して、std::vector<char>メモリ リークの可能性を最小限に抑えることができます。(C++newと上記を好む特別な理由はありません -とにかくdelete使用していますが、それを期待するスマート ポインター ライブラリがある場合)。strtok

そうは言っても、ブーストのような別のメカニズムを見つけることは、より良いオプションです. そのような代替案は、あなたの質問の下のコメントに投稿されたクリスのリンクで議論されていると思います....

于 2012-10-23T00:26:25.103 に答える