如何从非结构化.txt文件中读取单词并将每个单词存储在C中的char数组中?

时间:2017-10-10 10:51:18

标签: c arrays text

我有一个文本文件,其中包含以非结构化方式存储的随机单词。 (非结构化意义是随机空格和空行) - 例如文本文件:

file.txt的

word1 word2              word3 
         word4 
                        word5

     word6 

我想将这些单词中的每一个都读成char数组。我尝试了以下方法:

FILE *fp 

fp = fopen("file.txt","r")


int numWords =0;
char *arr = malloc(sizeof(char *));
while(!feof(fp)){
    fscanf(fp, "%s", arr);
    numWords++; 
}

fclose(fp);

出于某种原因,我无法访问数组中的每个单词。即我希望printf("%s", arr[0])返回word1等。但是,arr[0]会存储一个字符,在本例中为w

还有另一个问题。我在printf循环中放了一个while语句,它打印了最后一个单词word6两次,这意味着循环由于某种原因在结尾处执行了额外的时间。

如果有人可以帮助我实现这个目标,我将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:0)

您的代码只是具有未定义的行为,因此在删除它之前无法进行推理。

分配为单个char *指针分配空间,这通常意味着8或4个字节。就这样。那里没有空间来保存很多单词数据。 C不会自动附加到数组或类似的东西,您需要处理所需的每个存储字节的分配。当你继续在你分配的空间之外写字时,你会得到未定义的行为。

要存储这样的单词,您可能需要实现动态指针数组。这将涉及存储任意数量的指针;在添加到数组之前,指针(单词)本身需要在堆上单独分配。这是很多代码。

如果您愿意忍受一些静态限制(字长和字数),您当然可以这样做:

char words[1000][30];

这将为您提供1000个单词的空间,每个单词最多30个字符。您可能想要考虑重复数据删除,即在再次存储之前检查某个单词是否已存储。