4

这是我的代码。

#include <stdlib.h>
#include <stdio.h>

int main() {
    //Vars
    FILE *fp;
    char word[9999],
        *arrayOfWords[9999];
    int wordCount = 0, i;
    //Actions
    fp = fopen("data.txt", "r");
    if(fp != NULL) {
        while(!feof(fp)) {
            fscanf(fp, "%s", word);
            arrayOfWords[wordCount] = word;
            wordCount++;
        }
        for(i = 0; i < wordCount; i++) {
            printf("%s \n", arrayOfWords[i]);
        }
    puts("");
    } else {
        puts("Cannot read the file!");
    }
    return 0;
}

我正在尝试从文本文件中读取一些数据并将其存储到数组中。当我在循环中时一切都很好,但是当我离开那里时,我的数组中任何索引的任何值都被文件的最后一个单词填充。谁能帮我找出我正在做的错误?

数据文件:

Hello there, this is a new file.

结果:

file.
file.
file.
file.
file.
file.
file.
file.

任何帮助,将不胜感激!

4

3 回答 3

2

您需要为数组的每个单独成员分配内存(使用 malloc 或通过提供数组的第二维并将其声明为 typechar而不是char*)。你所做的类似于:

char *s;
scanf("%s", s);

而这行不通C。实际上,这里有 UB(未定义行为),因为指针未初始化。

编辑:你让数组中的所有字段都指向你的数组word,一旦你读过单词,你应该为字符串分配新的内存然后strcpy word进入它。

于 2013-02-18T16:21:53.447 回答
1

您的代码中至少有两点需要关注。char word[9999], *arrayOfWords[9999];定义arrayOfWords为 9999 的数组char pointers。这是值得关注的一点。

还有一点是arrayOfWords[wordCount] = word;。这里要存储新读取的字,需要像arrayOfWords指针数组一样分配空间。请找到您修改后的代码,如下所示。

int main() {
//Vars
FILE *fp;
char arrayOfWords[30];
int wordCount = 0, i;
//Actions
fp = fopen("data.txt", "r");
if(fp != NULL) {
    while(!feof(fp)) {
        fscanf(fp, "%s", &arrayOfWords[wordCount]);
        wordCount++;
    }
    puts("");
    for(i = 0; i < (wordCount - 1); i++) {
        puts(arrayOfWords[i]);
    }
puts("");
} else {
    puts("Cannot read the file!");
}
return 0;
}
于 2013-02-18T16:32:03.047 回答
0

这:

arrayOfWords[wordCount] = word;

不会将当前单词复制到单独的存储中,它只是分配另一个指针指向相同的存储块word。所以你最终得到一个指向同一个数组的指针word数组。您需要为每个单词单独分配内存并复制组成每个单词的字符(以及 NULL 终止符),而不是指针。

于 2013-02-18T16:32:36.453 回答