Список массивов в C, содержащий строки

#c #string #arraylist

Вопрос:

Я пытаюсь реализовать arraylist в C, который содержит строки в качестве элементов. Вот что у меня есть до сих пор:

 typedef struct ArrayList {  int length;  int capacity;  char *items; } ArrayList;   ArrayList *newList() {  char *items = malloc(4 * sizeof(char));  ArrayList *list = malloc(sizeof(ArrayList));  list-gt;length = 0;  list-gt;capacity = 4;  list-gt;items = items;  return list; }  // Check and expand list if needed void check(ArrayList *list) {  if (list-gt;length gt;= list-gt;capacity) {  list-gt;capacity = list-gt;capacity * 2;  list-gt;items = realloc(list-gt;items, list-gt;capacity * sizeof(char));  if (list-gt;items == NULL) {  exit(1);  }  } }  void add(ArrayList *list, char *s) {  check(list);  list-gt;items[list-gt;length] = s;  list-gt;length  ; }  

Однако, когда я пытаюсь запустить его, я получаю следующую ошибку:

 assignment makes integer from pointer without a cast [enabled by default].  list-gt;items[list-gt;length] = s;  

Комментарии:

1. почему вы назначаете s (что является a char[] ) list-gt;items (a int* )?

2. Я отредактировал свой код структуры так, чтобы list-gt;items был указателем на символ.

3. Если вы хотите сохранить несколько строк, то char *items; —gt; gt; char **items; и ряд связанных изменений. Вам также нужна память для строк (если только вы не храните только строковые литералы).

4. Ваш код в его нынешнем виде пытается создать «список массивов», содержащий символы , а не строки.

5. Я новичок в C, как бы я держал строки вместо символов?

Ответ №1:

Поскольку строка представляет собой массив символов, ArrayList.items она должна быть массивом указателей на массивы символов. Функция check() должна проверить и, при необходимости, расширить емкость этого массива указателей. Функция add() должна выделить место для новой строки в зависимости от ее размера.

В целом, измененный код может быть следующим:

 #include lt;stdio.hgt; #include lt;string.hgt; #include lt;stdlib.hgt;  typedef struct ArrayList {  int length;  int capacity;  char **items; } ArrayList;   ArrayList *newList(void) {  char **items = malloc(4 * sizeof(char *));  ArrayList *list = malloc(sizeof(ArrayList));  list-gt;length = 0;  list-gt;capacity = 4;  list-gt;items = items;  return list; }  // Check and expand list if needed void check(ArrayList *list) {  if (list-gt;length gt;= list-gt;capacity) {  list-gt;capacity = list-gt;capacity * 2;  list-gt;items = realloc(list-gt;items, list-gt;capacity * sizeof(char *));  if (list-gt;items == NULL) {  exit(1);  }  } }  void add(ArrayList *list, const char *s) {  check(list);  list-gt;items[list-gt;length] = malloc(strlen(s) 1);  strcpy(list-gt;items[list-gt;length], s);  list-gt;length  ; }