strtok ведет себя непоследовательно - PullRequest
4 голосов
/ 09 марта 2011

Я пытаюсь прочитать данные из файла, разбить их на токены и отсортировать, однако strtok работает некорректно при запуске, иногда это работает, иногда нет, и я получаю очень короткие / нечетные токены.

Кажется, что Valgrind думает, что это потому, что strtok полагается на неинициализированное значение (я думаю):

==7069== Conditional jump or move depends on uninitialised value(s)  
==7069==    at 0x40B61A3: strtok (strtok.S:160)  
==7069==    by 0x8048842: main (main.c:58)

Вот функция, которую, я думаю, обвиняет Вальгринд:

char * getNextToken(char * line) {  
    char delim = ',';  
    return strtok(line, &delim);  
}

Может ли это быть из-за того, что для большинства моих звонков линия NULL равна strtok?

Вот мои вызовы функции:

strcpy(performer, getNextToken(inputLine));  
strcpy(title, getNextToken(NULL));  
strcpy(charMin, getNextToken(NULL));  
/*etc...*/

Я понятия не имею, что может быть причиной этого, и все значения, которые я даю strtok, - это то, что я ожидаю. Кроме того, я иногда получаю сообщение об ошибке стека, не знаю почему.

Ответы [ 2 ]

7 голосов
/ 09 марта 2011

strtok принимает строку с нулем в конце для обоих аргументов. Вы не передаете один для вашего разделителя. попробуйте это:

char * getNextToken (char * line){
    const char *delim = ",";
    return strtok(line, delim);
}
1 голос
/ 09 марта 2011

Первый ответ имеет право относительно strtok ().Но помимо этого и, возможно, почему вы получаете «ошибки разрушения стека», это потому, что strtok будет возвращать указатель на любой токен, который он найдет, и если он больше, чем массив, выделенный для места назначения для strcpy (), онбудет радостно переполнять его.

Я бы рассмотрел использование strdup () вместо strcpy ().

...