2015-03-24 2 views
1

У меня есть следующий код, и мне нужна помощь в получении и сохранении последнего токена. В настоящий момент код токенируется после каждого пробела, но когда он доходит до конца моего текстового файла, он не отменяет последнее значение. Я уверен, что мне нужно иметь токен перед операторами malloc, но когда я добавляю его спереди, я получаю ошибку seg. Кто-нибудь знает проблему? Инициализировано myStruct.extras = NULL выше из-за realloc; это char **.Strtok с использованием динамической памяти

token = strtok(fileArrayPTR[p],"X"); 
while (token!= NULL) 
{ 

    if (tempCounter == 0) 
    { 
     token = strtok(NULL," "); 
     myStruct.dimensions[1] = strtol(token,&ptr,10); 
    }else{ 
     myStruct.extras = realloc(myStruct.extras,(extraCounter + 1) * sizeof(char *)); 
     myStruct.extras[extraCounter] = malloc(strlen(token)+1); 
     strcpy(myStruct.extras[extraCounter],token); 
     token = strtok(NULL," "); 
     extraCounter++; 
    } 
} 

редактировать: забыл поставить инкрементированным счетчик

+1

Где вы увеличиваете 'extraCounter'? –

+0

извините, забыли добавить это. У меня есть это в конце после токена – BeginnerC96

+0

@ BeginnerC96 Является ли строка нулевым завершением? Для цели отладки попробуйте рассчитать его длину, используя strlen. –

ответ

2

Это (второй вариант) код от вопроса:

token = strtok(fileArrayPTR[p],"X"); 
while (token!= NULL) 
{ 
    if (tempCounter == 0) 
    { 
     token = strtok(NULL," "); 
     myStruct.dimensions[1] = strtol(token,&ptr,10); 
    }else{ 
     myStruct.extras = realloc(myStruct.extras,(extraCounter + 1) * sizeof(char *)); 
     myStruct.extras[extraCounter] = malloc(strlen(token)+1); 
     strcpy(myStruct.extras[extraCounter],token); 
     token = strtok(NULL," "); 
     extraCounter++; 
    } 
} 

Это не автономная программа. Мы можем улучшить его следующим образом:

  • Извлечение структуры.
  • Показаны соответствующие объявления переменных.
  • Преобразование его в простой main().

эти изменения приводят к:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    int extraCounter = 0; 
    char **extras = 0; 
    int tempCounter = 0; 
    char *ptr = 0; 
    char data[] = "10X16 something another-thing"; 
    char *token = strtok(data, "X"); 
    int dimension1 = strtol(token, &ptr, 10); 
    int dimension2 = -1; 
    while (token!= NULL) 
    { 
     if (tempCounter == 0) 
     { 
      token = strtok(NULL," "); 
      dimension2 = strtol(token, &ptr, 10); 
      tempCounter++; 
     } 
     else 
     { 
      extras = realloc(extras, (extraCounter + 1) * sizeof(char *)); 
      extras[extraCounter] = malloc(strlen(token)+1); 
      strcpy(extras[extraCounter], token); 
      token = strtok(NULL, " "); 
      extraCounter++; 
     } 
    } 

    printf("Dimensions: %dx%d\n", dimension1, dimension2); 
    for (int i = 0; i < extraCounter; i++) 
     printf("%d: [[%s]]\n", i, extras[i]); 

    return 0; 
} 

И при запуске, он производит:

Dimensions: 10x16 
0: [[16]] 
1: [[something]] 
2: [[another-thing]] 

Есть ли проблема с этим кодом? Да, код для dimension2 не регенерирует strtok(), поэтому 16 обрабатывается дважды, один раз как измерение и один раз в виде строки. Наверное, не то, что нужно. Следовательно:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main(void) 
{ 
    int extraCounter = 0; 
    char **extras = 0; 
    int tempCounter = 0; 
    char *ptr = 0; 
    char data[] = "10X16 something another-thing"; 
    char *token = strtok(data, "X"); 
    int dimension1 = strtol(token, &ptr, 10); 
    int dimension2 = -1; 
    while (token != NULL) 
    { 
     if (tempCounter == 0) 
     { 
      token = strtok(NULL, " "); 
      dimension2 = strtol(token, &ptr, 10); 
      tempCounter++; 
     } 
     else 
     { 
      extras = realloc(extras, (extraCounter + 1) * sizeof(char *)); 
      extras[extraCounter] = malloc(strlen(token) + 1); 
      strcpy(extras[extraCounter++], token); 
     } 
     token = strtok(NULL, " "); 
    } 

    printf("Dimensions: %dx%d\n", dimension1, dimension2); 
    for (int i = 0; i < extraCounter; i++) 
     printf("%d: [[%s]]\n", i, extras[i]); 

    return 0; 
} 

Компиляция:

gcc -g -O3 -std=c11 -Wall -Wextra -Wmissing-prototypes -Wstrict-prototypes -Werror ss.c -o ss 

Выход:

Dimensions: 10x16 
0: [[something]] 
1: [[another-thing]] 

выглядит лучше ...

Смежные вопросы