Вы не можете изменить строковый литерал.
/* does not work */
char *data = "yes no";
strtok(data, " ");
Приведенное выше strtok
попытается разбить data
в пространстве, написав '\0'
там: data[3] = '\0';
, но строковые литералы не могут быть изменены. Попробуйте вместо
/* works */
char data[] = "yes no";
strtok(data, " ");
Редактировать: скопировать строковый литерал в массив символов
char *data = "string literal";
/* ... */
char *copy;
size_t datalen = strlen(data) + 1;
copy = malloc(datalen);
if (copy != NULL) {
strcpy(copy, data);
/* use copy now ... strtok(copy, " "); ... or whatever you need */
free(copy);
} else {
/* no memory. Tell user to upgrade computer :-) */
}