0

e: 皆さん、ありがとうございます。strtok が実際に文字列自体を変更することを認識していませんでした。うまくいけば、私は将来もっと愚かになるでしょう。

私は最近、本から C++ を学び始めました。私は今、文字列の解析に関する章にいます。

私の次の課題は、文字列のトークンを strtok で分割した後に元に戻すことですが、最初の区切り文字の後の文字列の残りの部分がどこにあるのかわかりません! 私はこれに非常に慣れていないので、これがばかげた質問である場合は申し訳ありません.

基本的に何が起こっているかは次のとおりです。 1. 「こんにちは、お元気ですか?」という文字列を入力します。2. 印刷すると、正常に出力されます。3. 次に、それをトークンに分割します (delimiters とスペースを使用) 4. それらはすべてき​​れいに出力されます 5. 文字列を再度出力すると、「hey」だけが残ります。

では、残りの文字列を取り戻すにはどうすればよいでしょうか。

これは私のコードです:

char the_string[ 81], *p;

cout << the_string << endl;

cout << "Input a string to parse: ";
cin.getline(the_string, 81);
p = strtok(the_string, ", ");
while (p != NULL) {
  cout << p << endl;
  p = strtok(NULL, ", ");
} 

cout << the_string << endl;
4

5 に答える 5

4

strtok()操作対象の文字列を変更します。

str != NULL の場合、関数はセパレーターではない最初の文字を検索します。この文字はトークンの始まりです。次に、関数は最初の区切り文字を検索します。この文字はトークンの終わりです。トークンの末尾が検出される前に str の末尾が検出された場合、関数は終了し、NULL を返します。それ以外の場合、トークンの末尾へのポインターは、後続の呼び出しのために静的な場所に保存されます。次に、この文字は NULL 文字に置き換えられ、関数はトークンの先頭へのポインターを返します。

に渡す前に文字列のコピーを作成しますstrtok()

C++ でこれを実現するためのより良い方法がありますが、これは宿題のように聞こえるため、おそらくそれらを使用することは許可されていません。

于 2012-08-14T17:53:02.217 に答える
4

strtok()'\0'トークンを見つけるたびにa を挿入して、操作対象の文字列を変更します。

そのため、文字列"one two three\0"(参照用に明示的'\0') は、スペースでトークン化されると、に変更され"one\0two\0three\0"、ほとんどの文字列操作はそれを次のように認識します"one"(今は削除しました'\0') 。

于 2012-08-14T17:53:52.520 に答える
0

strtok() が機能する方法は、区切り文字を文字列の終了文字に置き換えることです。それで「お元気ですか?」「ねえ、\0お元気ですか\0?」

これが、通常 strtok() を使用すべきではない理由の 1 つです。2 つ目の理由は、反復的に機能し、strtok() のさらなる呼び出しで使用する文字列に関する情報を保存することです。複数のスレッドから使​​用すると、その情報が上書きされ、それ以降の呼び出しが正しく機能しなくなります。

于 2012-08-14T18:02:05.627 に答える
0

次に関数を使用するときは、man ページを (より注意深く) 読んでください。Strtok() は、区切り文字の最初の文字をヌル文字に置き換えることにより、文字列をトークン化します。あなたの文字列は変更されてしまいます。このようなもの (\0 は NUL 文字を示します):

Hey\0 how\0 are\0 you?\0

strdup() 文字列を strtok() に渡す前に。

于 2012-08-14T17:53:59.763 に答える
0

strtokのドキュメントに次のように記載されています。

次に strtok() 関数は、現在の区切り文字列に含まれるバイトをそこから検索します。そのようなバイトが見つからない場合、現在のトークンは s1 が指す文字列の末尾まで拡張され、その後のトークンの検索では null ポインターが返されます。そのようなバイトが見つかった場合、現在のトークンを終了する null バイトで上書きされます。strtok() 関数は、トークンの次の検索が開始される次のバイトへのポインターを保存します。

つまり、文字列を出力すると、最初のトークンを通過してヌル文字に遭遇すると、文字列を出力する関数が停止します。NULL は通常、C 文字列の「文字列の終わり」を意味します。

于 2012-08-14T17:54:00.380 に答える