Использование массива указателей символов для хранения нескольких массивов символов

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

int num_clients_to_start = 0;
char *token1, *token2,  *str;
FILE* fp;
char bufr[256];
char testchar[255] = {}; 
char *start_client[10];

while(fgets(bufr, 256, fp) != NULL){

    if(bufr[0] == '#'|| bufr[0] == '\n')
    continue;

    str = bufr;

    token2 = "";  /* initializing an empty token 2 */
        for(str = bufr;  ;str = NULL){
    token1 = strtok(str, " ");
    if(strcmp(token2, "client_name") == 0){
        sprintf(testchar,"%s", token1);
            start_client[num_clients_to_start] = testchar;
        num_clients_to_start++;
    }                   

    token2 = token1;

    if(str == NULL){
            break;
    }
  }//end of for loop

}//end of while loop

printf("client1 = %s client2 = %s client3 = %s",start_client[0],start_client[1],start_client[2]);

Мой входной файл выглядит следующим образом:

client_name abc
client_name def
client_name xyz

И вывод оператора печати:

client1 = xyz
client2 = xyz
client3 = xyz

person Zahaib Akhtar    schedule 21.10.2013    source источник


Ответы (2)


Вы назначаете один и тот же указатель всем записям в массиве start_client. Массив testchar получит разное содержимое, но указатель на него всегда будет один и тот же. Возможно, вы захотите сделать start_client массивом массивов char и вместо этого скопировать строку.

Нравиться

char start_client[10][256];

И

strcpy(start_client[num_clients_to_start++], token1);
person Some programmer dude    schedule 21.10.2013
comment
извините, я думаю, что, должно быть, пропустил назначение token1 при копировании моего кода. Сделали редактирование - person Zahaib Akhtar; 21.10.2013
comment
Да, это так, указатель на testchar один и тот же, поэтому в конце все операторы печати печатают одно и то же. Вот и хочу узнать, как этого избежать? - person Zahaib Akhtar; 21.10.2013
comment
@ZahaibAkhtar Да. Либо так, либо используйте strdup (но тогда вы должны помнить free указатели, когда закончите с ними). - person Some programmer dude; 21.10.2013
comment
Итак, в вашем решении выше в основном start_client[0] будет первым массивом, start_client[1] будет вторым и так далее? - person Zahaib Akhtar; 21.10.2013
comment
Спасибо, это пополнило мои знания. Теперь я немного смущен, должен ли я принять ваш ответ или ответ @AlterMann. Оба покрыли одно и то же решение. - person Zahaib Akhtar; 21.10.2013
comment
Захайб, если ты сомневаешься, всегда принимай самый старый ответ (Иоахим) - person David Ranieri; 21.10.2013

Обратите внимание, что start_client[0], [1], [2] все указатели на последнюю строку (прочитанную fgets)

Используйте strdup, чтобы выделить их:

start_client[num_clients_to_start] = strdup(testchar);

Поскольку strdup может быть внешним идентификатором, используйте прототип

#include <string.h>

char *strdup(const char *s); 

И не забудьте free() в конце

person David Ranieri    schedule 21.10.2013