C中的字符串数组

时间:2010-02-24 20:00:23

标签: c arrays data-structures string

我正在尝试创建一个存储字符串的结构,当我尝试将其作为字符串插入数组时,我遇到了一个错误不兼容的类型。这是我第一次使用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 个答案:

答案 0 :(得分:4)

您有一个char数组,但是您尝试将char *放入其中。

我猜我会strncpy做你想做的事。或者,将item声明为char *的数组。

答案 1 :(得分:3)

struct list {
   int sz;
   int maxsz;
   char *item[1024]; 
};

答案 2 :(得分:2)

C和C ++之间的差异比它通常承认的要多。

对于你的错误,原因很简单,你试图在sz分配一个指针(char *)是一个int。 这种赋值会生成不兼容的类型警告。

你不能做的第二件事(至少据我所知)是一个部分动态的数组。在你的情况下,你应该至少使用malloc,项目的类型应该是char **。但是,有一个技巧只能使用一个malloc来创建2D数组。

对于realloc没什么打击我...编译错误是什么?

但是您的代码看起来不像C代码:/

您可能需要从头开始重建它,因为您在这里混淆列表和2D数组...

如果你愿意,我可以写一些代码示例,但你应该在google上找到一个C基础教程。

好的卢克:)

答案 3 :(得分:0)

在这一行:

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

(*p)->item[(*p)->sz]是一个1024字符的数组 - 你不能分配给=的数组(数组是“不可修改的左值”)。

你只需要复制一份。对于长度安全的字符串副本,我更喜欢使用strncat()

(*p)->item[(*p)->sz][0] = '\0'; /* Truncate existing string to empty */
strncat((*p)->item[(*p)->sz], data, (sizeof (*p)->item[(*p)->sz]) - 1);