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