strtok()
изменяет свою входную строку, заменяя разделители на 0; Итак, если ваш код выглядит примерно так:
char parm[] = "abc,def";
f1(parm);
f1(parm);
после первого вызова f1, символ ',' перезаписывается 0, который является ограничителем строки, поэтому второй вызов видит только «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, " ,");
}
}