Массив строк в C - PullRequest
       17

Массив строк в C

2 голосов
/ 24 февраля 2010

Я пытаюсь создать структуру, хранящую строки, и получаю сообщение об ошибке несовместимых типов, когда пытаюсь вставить строку в массив. Это мой первый опыт работы с программой на C. Может ли кто-нибудь помочь определить мою проблему.

Это моя реализация list.c

struct list *init_list(int num) {
    struct list *p;
    p = malloc(LISTSZ(num));
    if(p == NULL)
        return(NULL);
    p->maxsz = num;
    p->sz = 0;
    return(p);
}

void debug_list(struct list *p) {
    int i;
    fprintf(stderr, "\nDynamic List\n\n");
    fprintf(stderr, "   sz  = %d\n", p->sz);
    fprintf(stderr, "   maxsz   = %d\n", p->maxsz);
    for(i = 0; i < p->maxsz; i++)
        fprintf(stderr,"    %s\n", (p->item[i]));
}

void prt_list(struct list *p) {
    int i;
    for(i = 0; i < p->sz; i++)
        printf("%s\n", (p->item[i]));
}

int ins_list(char *data, struct list **p) {
    struct list *q;
    if((*p)->sz == (*p)->maxsz) {
        q = realloc(*p, LISTSZ((*p)->maxsz + INCRSZ)); // Problem?
        if(q == NULL)
            return(-1);
        q->maxsz += INCRSZ;
        *p = q;
    }
    (*p)->item[(*p)->sz] = data; // incompatible types in assignment
    (*p)->sz ++;
    return(0);
}

Это моя реализация list.h

struct list {
    int sz;
    int maxsz;
    char item[][1024]; // Problem?
};

#define INITSZ 5
#define INCRSZ 5
#define LISTSZ(n) ((size_t)(sizeof(struct list) + ((n)-1)*sizeof(char[1024]))) // Problem?

struct list *init_list(int num);
int ins_list(char *data, struct list **p);
void prt_list(struct list *p);
void debug_list(struct list *p);

Ответы [ 4 ]

4 голосов
/ 24 февраля 2010

У вас есть массив char, но вы пытаетесь вставить в него char *.

Я бы предположил, что strncpy будет делать то, что вы хотите. В качестве альтернативы, объявите item как массив char *.

3 голосов
/ 24 февраля 2010
struct list {
   int sz;
   int maxsz;
   char *item[1024]; 
};
2 голосов
/ 24 февраля 2010

Там больше различий между C и C ++, чем это обычно допускают.

По вашей ошибке причина проста: вы пытаетесь назначить указатель (char *) на sz, который является int. Этот вид назначения генерирует предупреждение о несовместимом типе.

Второе, что вы не можете сделать (по крайней мере, насколько я знаю) частично динамическим массивом, как вы это делаете. В вашем случае вы должны использовать хотя бы malloc, а тип элемента должен быть char **. Однако есть хитрость в использовании только одного malloc для создания 2D-массива.

Для realloc меня ничто не поразило ... В чем ошибка компиляции?

Однако ваш код не похож на код C: /

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

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

Хорошо, Люк:)

0 голосов
/ 25 февраля 2010

В этой строке:

(*p)->item[(*p)->sz] = data; // incompatible types in assignment

(*p)->item[(*p)->sz] - это массив из 1024 символов - вы не можете назначать массивы с = (массивы - это «немодифицируемые значения l»).

Вам просто нужно сделать копию. Для безопасной строки длины я предпочитаю использовать strncat():

(*p)->item[(*p)->sz][0] = '\0'; /* Truncate existing string to empty */
strncat((*p)->item[(*p)->sz], data, (sizeof (*p)->item[(*p)->sz]) - 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...