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

标签 c arrays text

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

文件.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 两次,这意味着循环会在由于某种原因结束。

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

最佳答案

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

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

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

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

char words[1000][30];

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

关于c - 如何从非结构化 .txt 文件中读取单词并将每个单词存储在 C 中的 char 数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46664890/

相关文章:

iphone - iPhone 上的文字颤抖

css - 当不透明度低于 1 时,字体带有奇怪的阴影(模糊)(仅限 Chrome)

从文本文件中一个一个地计算字符

c - 代码中的一些错误 - libpcap

c++ - iPhone OpenCV形状识别教程

字符串指针与数组

c++ - 程序选择 '\0',即使它没有被提及——澄清

c - 使用 static 而不是 malloc - C 语言

c - 字符串中所有可能的字符组合

php - 插入html/文本到mysql