strtok
最後のトークンの場所に NULL を挿入することによって入力文字列を変更するという事実のために、注意して考慮する必要があることを常に理解しています。これはcppreferenceによっても検証されます。
ただし、cplusplus.com の例を検証しようとすると、32 ビット Windows 7 の VS2010 で、実際には strtok が元の文字列に NULL を挿入していないことがわかりました。例の引数の NULL を str に変更することでこれを特定できました。プログラムはループを繰り返し、"This" をトークンとして渡します。 cppreferenceが主張するように、ポインター。
また、文字列リテラルの定数性に問題があるのではないかと思ったので、文字列をコピーしました
char str2[] ="- This, a sample string.";
char str[50];
strcpy(str,str2);
もう一度実行しましたが、ループが繰り返されました。デバッガーは、入力文字列が変更されていないことを示しています。
ここで私が間違っている場所を誰かが説明できますか? 編集:「以前に保存されたポインターがstrとして渡された場合と同じ動作です」の私の解釈だと思います。
ありがとうございました。
編集:正確なコード:
/* strtok example */
#include <iostream>
#include <stdio.h>
#include <string.h>
int main ()
{
char str2[] ="- This, a sample string.";
char str[50];
strcpy(str,str2);
char * pch;
printf ("Splitting string \"%s\" into tokens:\n",str);
pch = strtok (str," ,.-");
while (pch != NULL)
{
printf ("%s\n",pch);
pch = strtok (str, " ,.-");
printf("%s\n", str);
}
std::cin.ignore();
return 0;
}
コードからの出力:
Splitting string "- This, a sample string." into tokens:
This
- This
This
- This
This
- This
This
- This
This
- This
This
- This
This
- This
編集: 解決済み このガベージを削除するか、そのままにしておく必要がありますか? これに対処しなければならなかった貧しい人々からポイントを奪いたくありません。