Лучший способ поддерживать массив строк в C - PullRequest
0 голосов
/ 09 марта 2011

Есть ли лучший способ поддерживать список строк в C, кроме использования typedef char * и объявления массива типа string?Я пытаюсь управлять списком имен членов, которые присоединяются к группе через программу сокетов.Но каждый раз, когда новый участник присоединяется к группе - старые имена участников переопределяются.Часть примера кода выглядит так:

typedef char * string;
string  List[10];

, а новый член присоединяется так:

List[index]=membername;

Спасибо.

Ответы [ 4 ]

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

Все зависит от того, как распределяется membername.Если это статическая строка, которую вы используете повторно, заполняя ее новым именем при каждом входе, вы перезаписываете строку несколько раз.Хранение указателя на строку не будет хранить содержимое строки, оно просто сохранит ее адрес.

Чтобы сделать это правильно, вам нужно выделить (используя malloc()) новую строку для каждой новойназвание.Каждый новый указатель строки затем присваивается другому члену в массиве.

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

В случае базовых C-типов вам необходимо иметь List в качестве указателя на указатель, а затем для каждого нового имени элемента перераспределять его для другой строки (или установить постоянное максимальное количество строк - , что может вызвать неприятные переполнения памяти - но если вы модулируете индекс, это безопасно).

  • Для каждого нового имени пользователя вам нужно выделить char* (строка c) для этого имени пользователя, если вы хотите сохранить только это имя, вы можете использовать malloc(strlen(membername)+1), чтобы выделить его с пробелом для нулевого символа с нулем в конце.

  • Когда это будет сделано, у вас есть память длявставьте строку, сделайте это с помощью strcpy(List[index++], membername).

  • Если вы используете статическое максимальное количество строк, вы должны использовать strpcy(List[(index++)%ALLOCATEDSTRINGS,membername).

1 голос
/ 09 марта 2011

Возможно, вы (недостаточно контекста) неправильно распределяете строки.

string List[10];

выделяет только массив из 10 string, то есть 10 char *, то есть 10 символьных указателей. Он не выделяет памяти для самих строк.

Так что если ваш membername выше, например, глобальный char *, в который вы копируете данные из сети, все ваши слоты в List в конечном итоге будут указывать на то же самое место памяти .

Чтобы это работало, вам нужно выделить (и тщательно освободить) все слоты в List. Что-то вроде:

List[index] = strdup(membername);

Для повышения вероятности раннего обнаружения ошибок сначала установите List на все нулевые указатели.

for (int i=0; i<10; i++) List[i] = NULL;

и когда пользователь «уходит», освободите и сбросьте этот слот в NULL:

free(List[index]);
List[index] = NULL;

Таким образом, вы получите отличные, неприятные ошибки, если не будете достаточно тщательно управлять своими слотами: -)

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

Я бы использовал массив выделенных символов *, и, если вам нужно, сделайте так, чтобы вы могли динамически увеличивать массив.

Таким образом, вы получите:

char **List = calloc(num_members,sizeof(char *));

Затем, когда кто-то присоединится к группе, у вас будет:

List[current_index] = calloc(strlen(new_user_name) + 1,sizeof(char));
strcpy(List[current_index++],new_user_name);

Имейте в виду, что num_members должен начинаться достаточно большим, чтобы обрабатывать столько участников, сколько захотят присоединиться, либо выиногда приходится перераспределять больший массив.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...