Проблема с программой на С, никогда не возвращающейся из функции strtok () - PullRequest
1 голос
/ 03 мая 2011

Я работаю над университетским заданием, и я ломаю голову над странной проблемой, когда моя программа вызывает strtok и никогда не возвращается.

Мой код выглядит так:

int loadMenuDataIn(GJCType* menu, char *data)
{
   char *lineTokenPtr;
   int i;

   lineTokenPtr = strtok(data, "\n"); 
   while (lineTokenPtr != NULL) { 

   /* ... */

   }

}

Я просмотрел несколько сайтов в Интернете, но я не вижу ничего плохого в том, как я использую strtok, и я не могу определить, почему мой код застрял на линии lineTokenPtr = strtok(data, "\n");

Может кто-нибудь помочь мне пролить свет на это?

(Использование OSX и Xcode, если это имеет значение)

Ответы [ 2 ]

2 голосов
/ 03 мая 2011

вы проверили содержание аргумента?это \ 0 завершено?

аргумент, который вы передаете, это доступная для записи память?strtok записывает в буфер то, что он получает в качестве первого аргумента при токенизации строки.

IOW, если вы напишите

char* mystring = "hello\n";

strtok(mystring,"\n"); // you get problems
0 голосов
/ 03 мая 2011

Функция strtok() заменяет действительные символы разграничения токенов в строке символов на нулевые (т. Е. \0) символы и возвращает указатель на начало токена в строке.Таким образом, после повторных вызовов strtok() с символом-разделителем новой строки, строковый буфер, который выглядел как

"The fox\nran over\nthe hill\n"

в памяти, будет буквально изменен на месте и превращен в

"The fox\0ran over\0the hill\0"

с char указателями, возвращенными из strtok(), которые указывают на строки the fox\0, ran over\0 и the hill\0.Новая память не выделяется ... исходная строковая память модифицируется на месте, что означает, что важно не передавать строковый литерал типа const char*.

...