Поскольку вы изменили свой тег на C, а не на C ++, я переписал вашу функцию для использования printf, чтобы вы могли видеть, что происходит.Хоанг прав.Вы видите правильный вывод, но я думаю, что вы печатаете все в одной строке, поэтому вы запутались в выводе.Посмотрите на ответ Хоанга, который объясняет, что происходит правильно.Также, как отмечали другие, strtok уничтожает входную строку, поэтому вы должны быть осторожны с этим - и это не безопасно для потоков.Но если вам нужен быстрый грязный токенизатор, он работает.Кроме того, я изменил код, чтобы правильно использовать strlen, а не sizeof, как правильно указал Андерс.
Вот ваш код, модифицированный так, чтобы он был более похож на C:
char* str = (char*) malloc(strlen("Madddy") + 1);
strcpy(str,"Madddy");
char* tmp = strtok(str,"d");
printf ("first token: %s\n", tmp);
do
{
tmp=strtok(NULL, "ay");
if (tmp != NULL ) {
printf ("next token: %s\n", tmp);
}
} while(tmp != NULL);