2017-10-10 57 views
0

我有一个文本文件,以非结构化的方式存储随机词。 (非结构化的意思是随机空间和空行) - 例如文本文件:如何从非结构化.txt文件读取单词并将每个单词存储在C中的char数组中?

file.txt的

word1 word2    word3 
     word4 
         word5 

    word6 

我想这些词读入字符数组。我尝试了以下内容:

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

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

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

+4

请参阅:[为什么“while(!feof(file))”总是出错?](https://stackoverflow.com/q/5431941/4389800) – usr

+0

如果您需要存储所有单词,则需要一个指针数组(或数组)。现在你只需要一个char *'(它的大小也不够)。 –

+1

在C中,一个字符串是一个由零结尾的字符数组。你的'malloc'调用基本上要求系统分配一个*数组*,然后传给['fscanf'](http://en.cppreference.com/w/c/io/fscanf),它会读取在这个数组中添加“单词”并添加一个终止符。这有一个小问题:你只给一个char *(通常是4或8字节)分配空间,然后在这个内存中读入一个可能更长的单词。 –

回答

0

您的代码只是具有未定义的行为,因此直到您将其删除后才能推理。

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

要存储这样的单词,您可能需要实现一个动态指针数组。这将处理存储任何数量的指针;在添加到数组之前,指针(字)本身将需要在堆上单独分配。这是相当多的代码。

如果你愿意忍受一些静态的限制(单词的长度和字数),当然你也可以这样做:

char words[1000][30]; 

那将最多30给你空间,1000个字的每个字符。您可能想要考虑取消重复数据,即在再次存储之前检查单词是否已经存储。

+0

嗨@unwind,如果我有char字词[1000] [30],我将如何使用fscanf实现循环?谢谢! – novice

+0

@novice use'char words [1000] [100];'秒尺寸100每行显示字符数,1000显示行数。您可以使用[此代码](https://ideone.com/LUxzR0) – EsmaeelE

相关问题