问题描述
我具有此功能,其中list
是指向链表的指针。这是包含数据节点的列表结构。
typedef struct node{
char *data;
struct node *next;
}NODE;
typedef struct list{
NODE* head;
char *id;
struct list *next;
int size;
}LIST;
我的目标是从列表中获取所有数据,并将其作为**char
返回。看起来好像可以,但是我在 words = (char**) calloc(numOfWords*wordLength,sizeof(char));
所在的行中不确定它是否正确以及如何正确工作。您能看到我的代码中出了什么问题并为我提供帮助吗?谢谢。
char **reset_words(LIST *list){
char ** words;
int i = 0,j = 0,wordLength,numOfWords = list->size;
NODE *p;
for (p = list->head; p != NULL; p = p->next) {
wordLength = my_strlen(p->data);
words = (char**) calloc(numOfWords*wordLength,sizeof(char));
for(int k=0;k < wordLength;k++){
words[i][j] = p->data[k];
j++;
}
i++;
}
return words;
}
解决方法
我查看了您的代码之后,进行了一些更改:
- 如果您的列表是正确完成的链表,并且所有节点的数据大小相同,则只需执行
wordLength = strlen(list->head->data)
。 - 初始化循环外的单词。我的操作方式应该可以。
- 由于您具有字符串,因此只需执行
strcpy(words[i],p->data)
即可将字符串添加到单词数组中。
尝试一下,让我知道它是否有效。
char **reset_words(LIST *list){
char ** words;
int i = 0,j = 0,wordLength = strlen(list->head->data),numOfWords = list->size;
NODE *p;
words = (char **)malloc(numOfWords * sizeof(char *));
for (int h=0; h<numOfWords; h++)
words[h] = (char *)calloc(wordLength,sizeof(char));
for (p = list->head; p != NULL; p = p->next) {
strcpy(words[i],p->data);
i++;
}
return words;
}
,
wordLength = my_strlen(p->data);
我不知道my_strlen()
的作用。但是您必须记住要为结尾的\0
保留额外的空间。
words = (char**) calloc(numOfWords*wordLength,sizeof(char));
这没有什么意义... numOfWords
似乎是节点数,而wordLength
是实际数据的长度。因此numOfWords * wordLength
可以用于计算所有字符的总空间量(但仅当wordLength
是最大字符串的长度时)。
根据您的要求(您是否真的需要复制字符串或引用就足够了?),您可以将其表示为:
char **words = calloc(list->size,sizeof words[0]);
size_t i = 0;
for (struct node *p = list->head; p; p = p->next) {
if (1)
words[i++] = p->data;
else
words[i++] = strdup(p->data);
}