gpt4 book ai didi

c - C中使用指针的动态字符串数组

转载 作者:太空宇宙 更新时间:2023-11-04 03:20:07 26 4
gpt4 key购买 nike

我是 C 语言的新手。我使用动态字符串数组。我想将文本文件中的所有单词加载到一个字符串数组中。我动态地将项目添加到数组中。它几乎可以工作,但是当我想将它们打印出来时,我重复了单词。我认为问题出在 dictionary = (char **)realloc(dictionary, sizeof(char *) * (idx)); 复制原始数据后数组应该增加 1。

int main() {

FILE *fr;
int i = 0;
int c;
const char *path = "..../sample.txt";
char *word;
char **dictionary;
word = (char *)malloc(sizeof(char));
dictionary = (char **)malloc(sizeof(char *));

int idx = 0; // index of word
int widx = 0; // index of char in word

fr = fopen(path, "r");
while((c = getc(fr)) != EOF){
if( c == ' '){
widx++;
word = (char *)realloc(word, sizeof(char) * (widx));
*(word + widx-1) = '\0';
idx++;
dictionary = (char **)realloc(dictionary, sizeof(char *) * (idx));
*(dictionary+idx-1) = word;
widx = 0;
word = (char *)realloc(word, 0);
}
else if( c == '.' || c == ',' || c == '?' || c == '!' ){
// skip
}
else{
widx++;
word = (char *)realloc(word, sizeof(char) * (widx));
*(word + widx-1) = (char)c;
}
}
fclose(fr);

// print words
int n = idx;
for(i = 0; i < n; i++){
printf("%d - %s \n", i, *(dictionary+i));
}
return 0;
}

输出:

0 - shellbly 
1 -
2 - shellbly
3 - Bourne-derived
4 - shellbly
5 - Bourne-derived
6 - shellbly
7 - Bourne-derived

预期:

1 - The 
2 - original
3 - Bourne
4 - shell
5 - distributed
6 - with
7 - V7
8 - Unix

我一定做错了什么。感谢您的任何反馈。

最佳答案

realloc(word, 0) 等同于free(word)。但是该指针 word 与您刚刚存储为 dictionary 元素的指针相同,这意味着访问 dictionary 的指针元素不再有效>.

除了word = realloc(word, 0);,你可以只做word = NULL;。这将导致下一个 realloc 分配新的存储空间,并将指针单独留在 dictionary 中。

如果您担心正确清理您分配的内存,您稍后可以释放 dictionary 中的所有有效指针。

关于c - C中使用指针的动态字符串数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47127853/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com