strtok()
区切り文字を0で上書きすることにより、入力文字列を変更します。したがって、コードが次のようになっていると仮定します。
char parm[] = "abc,def";
f1(parm);
f1(parm);
f1を最初に呼び出した後、「、」文字は文字列ターミネータである0で上書きされるため、2番目の呼び出しでは「abc」のみが文字列として認識されます。
strtok()
入力を変更するため、引数として文字列リテラルを渡したくないことに注意してください。文字列リテラルの内容を変更しようとすると、未定義の動作が発生します。
安全な方法は、f1内にローカル文字列を作成し、名前の内容をコピーしてから、そのローカル文字列をに渡すことstrtok()
です。以下はC99で動作するはずです:
void f1(char *name)
{
size_t len = strlen(name);
char localstr[len+1];
char *tmp;
strcpy(localstr, name);
tmp = strtok(localstr, " ,");
while(tmp)
{
...
tmp = strtok(NULL, " ,");
}
}