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

时间:2012-03-25 02:47:08

标签: c malloc

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

3 个答案:

答案 0 :(得分:4)

那是因为你是与数组所有位置的char相同的指针。

当你这样做时:

words[i] = txt;

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

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

您的代码还存在另一个问题,即字符串数组的分配。 它应该是:

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

这是因为字符串数组是指向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]);
}

答案 1 :(得分:1)

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

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;
    }
}

答案 2 :(得分:0)

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