2013-06-06 2 views
1

У меня есть структура, объявленная как extern conf_t conf.ключевое слово extern и строковые переменные

typedef struct { 
    int  home_dir_len; 
    char  *home_dir; 
    int  key_file_len; 
    char  *key_file; 
    unsigned int max_mem; 
    unsigned int runtime; 
} conf_t; 

Я пытаюсь установить его переменные с помощью функции ниже, но только целые значения Создаются, а не строки.

if (strcmp(tok1, "HOME_DIR") == 0) { 
    char *dir = strtok(NULL, &delim); 
    conf.home_dir_len = strlen(dir); 
    conf.home_dir = dir; 
} 
else if (strcmp(tok1, "KEY_FILE") ==0) { 
    char *key = strtok(NULL, &delim); 
    conf.key_file_len = strlen(key); 
    conf.key_file = calloc(conf.key_file_len +1, sizeof(char)); 
    conf.key_file = key; 
} 
else if (strcmp(tok1, "MAX_MEM") ==0) { 
    conf.max_mem = atoi(strtok(NULL, &delim)); 
} 
else if (strcmp(tok1, "RUNTIME") ==0) { 
    conf.runtime = atoi(strtok(NULL, &delim)); 
} 
else { 
    perror("you shouldnt be here"); 
} 

Это выход:

conf.home_dir_len = 5 
conf.home_dir = ' and more empty lines 
' **This should be /tmp/** 
conf.key_file_len = 10 
conf.key_file = 'nd more empty lines 
' **this should be myfile.key** 
conf.max_mem = 10 
conf.runtime = 10 

Можете ли вы объяснить, почему и как я могу это исправить?

+3

Здесь вы действительно не показали достаточно контекста. Каково определение структуры? Как минимум, вы просачиваете результат вызова 'calloc'. И 'sizeof (char)' is '1'. –

+0

как я могу отредактировать свой код, чтобы этого не делать, я добавил calloc для второй части, чтобы узнать, не изменилось ли это, но это не так, поскольку оба они все еще ошибочны. – cxzp

ответ

1

В каждом if(condition), где вы выполняете назначение char *, очевидно, что обработка строки strtok() является временной заменой для ссылки. Вам нужно сформировать копию строки для вашей структуры. Вы частично это сделали (вы выделили данные, но не скопировали строку) в conf.key_file =, но пропустили его в conf.home_dir =. Рекомендовать:

// delete conf.home_dir = dir; 
conf.home_dir = strdup(dir); 
... 
// delete conf.key_file = calloc(conf.key_file_len +1, sizeof(char)); 
// delete conf.key_file = key; 
conf.key_file = strdup(key); 

Как указал @Carl Norum, должно быть больше кода. Поэтому, хотя вышеупомянутая идея может решить проблему. без дополнительного кода, это может быть только частичное решение.

strdup(s) делает 3 вещи. Он выделил достаточно памяти для копии s в say 's2'. Он копирует 's' в s2. Затем он возвращает 's2'.

+0

спасибо, что сработало отлично, мне удалось исправить это прошлой ночью но было слишком поздно обновлять его здесь, я закончил пространство для вызова, а затем использовал strcpy, но strdup умнее! – cxzp

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