c-填充动态分配的字符串数组



我有以下代码来填充字符串数组,但每次更改值时,整个数组都会更改(而不是数组中的单个字符串)

这是因为对于数组的所有位置,您都是指向char的同一指针。

当你这样做:

words[i] = txt;

您正在分配一个指针。因此,每个单独的word[i]都是相同的字符串(txt)。如果您真的想将单词读取到缓冲区(如txt)中,然后将其放入字符串数组中,则需要将缓冲区字符串的内容复制到数组中的字符串中,如下所示:

strncpy(words[i], txt, MAX_WORD_LENGTH);

代码还有另一个问题,那就是字符串数组的分配。应该是:

words = (char**)malloc(wordcount * sizeof(char*));

这是因为字符串数组是指向字符指针(char**)的指针,数组的每个元素都是字符串(char*)。现在您已经分配了一个char指针数组,但还没有为每个字符串分配内存,这就是我们接下来要做的:

for (i = 0; i < wordcount; i++) {
    words[i] = (char*)malloc(MAX_WORD_LENGTH * sizeof(char));
}

如果你不想使用缓冲区直接读取字符串数组,你的代码应该是这样的:

words = (char**)malloc(wordcount * sizeof(char*));
input = fopen(filename, "r");
while(!feof(input)) {
    words[i] = (char*)malloc(MAX_WORD_LENGTH * sizeof(char));
    fscanf(input, "%s", words[i]);
}

您需要为每个单词分配空间,并将字符串复制到这个分配的空间:

input = fopen(filename, "r");
while(!feof(input)){
    if(fscanf(input,"%s", txt)){
        /* malloc for word here */
        words[i] = malloc(strlen(txt)+1);
        strcpy(words[i], txt); //<---Problem line right here
        ++i;
    }
}

这段代码的问题是,您分配了一个缓冲区来接收来自fscanf的字符串数据。每次从文件中读取字符串时,都会将其放在txt缓冲区中。单词数组中的每个指针都指向txt。因此,在操作结束时,有许多指针指向同一个缓冲区,该缓冲区包含一个字符串。

相关内容

  • 没有找到相关文章

最新更新