Strtok_r возвращает NULL - PullRequest
       10

Strtok_r возвращает NULL

0 голосов
/ 19 июня 2019

Я пытаюсь токенизировать строку, взятую из файла.strtok_r корректно работает с первой подстрокой и возвращает ноль (и ошибка сегментации, потому что я пытаюсь войти в другой var)

char buffer[500];
char * c;
char * c1;
char * c2;
//....
while(fgets(buffer, sizeof(buffer), f) != NULL){
    c2 = buffer;
    printf("%s\n", buffer);
    c = strtok(c2, ":");
    for(int i = 0; i < 4; i++){
        c = strtok(NULL, ":");
        printf("%s\n", c);
    }
    if(strcmp(c, argp->origen) == 0){
        c = strtok(NULL, ":");
        printf("%s\n", c);
        if(strcmp(c, argp->destino) == 0){
            nodo = malloc(sizeof(lista_vuelo));
            c2 = buffer;

            c = strtok_r(c2, ":", &c1); 
            nodo->IdReg = atoi(c);
            printf("\n%d test\n", nodo->IdReg); //Works until here

            c = strtok_r(NULL, ":", &c1);
            printf("\n%s\n", c); //Prints null and then segmentation fault

            nodo->Idvuelo = strndup(c, strlen(c));
            printf("\n%s\n", nodo->Idvuelo);
//....

Ввод из файла:

3: IBE3674: 02-04-2019: 19-45: Мадрид: Берлин: Барахас: Тегель: ИБЕРИЯ: 210: 35: 6: T4: 60: N

Выход:

3 тест -> ожидаемый результат

(null)
Violación de segmento (`core' generado) -> Segmentation fault, (null) should be IBE3674

1 Ответ

2 голосов
/ 19 июня 2019

strtok не просто изменяет переданный им указатель, но на самом деле является самой строкой. Он заменяет каждый найденный разделитель символом null.

Если у вас есть строка test:strtok:for:me и вызовите strtok, как только у вас будет test\0strtok:for:me после этого.

Поэтому, когда вы выполняете итерацию, первые пару жетонов каждый : заменяется на \0. Если вы теперь сбросите свой указатель c2 на начало строки и снова вызовете strtok, strtok находит символ null до того, как находит разделитель, и предполагает, что строка закончилась до того, как найден разделитель, и возвращает NULL.

...