我有一个文本文件,其中包含以非结构化方式存储的随机单词。 (非结构化意义是随机空格和空行) - 例如文本文件:
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
两次,这意味着循环由于某种原因在结尾处执行了额外的时间。
如果有人可以帮助我实现这个目标,我将不胜感激,谢谢!
答案 0 :(得分:0)
您的代码只是具有未定义的行为,因此在删除它之前无法进行推理。
分配为单个char *
指针分配空间,这通常意味着8或4个字节。就这样。那里没有空间来保存很多单词数据。 C不会自动附加到数组或类似的东西,您需要处理所需的每个存储字节的分配。当你继续在你分配的空间之外写字时,你会得到未定义的行为。
要存储这样的单词,您可能需要实现动态指针数组。这将涉及存储任意数量的指针;在添加到数组之前,指针(单词)本身需要在堆上单独分配。这是很多代码。
如果您愿意忍受一些静态限制(字长和字数),您当然可以这样做:
char words[1000][30];
这将为您提供1000个单词的空间,每个单词最多30个字符。您可能想要考虑重复数据删除,即在再次存储之前检查某个单词是否已存储。