【问题标题】:How to read words from unstructured .txt file and store each word in a char array in C?如何从非结构化 .txt 文件中读取单词并将每个单词存储在 C 中的 char 数组中?
【发布时间】:2017-10-10 10:51:17
【问题描述】:

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

文件.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

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

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

【问题讨论】:

  • 如果你需要存储所有的单词,你需要一个指针数组(或数组)。现在你只有一个char*(大小也不够)。
  • 在 C 中,字符串是一个字符数组,以零结尾。您的malloc 调用基本上要求系统分配一个字符数组,然后您将其传递给fscanf,它会将“单词”读入该数组并添加一个终止符。这样做有一个小问题:您只为单个 char * 分配空间(通常为 4 或 8 个字节),然后将一个可能更长的单词读入该内存。
  • 至于您的问题,您需要的是一个指针数组(类型为char **),然后为该数组中的每个条目分配足够的内存来保存一个字符串。然后将数组中的指针传递给 fscanf 作为单词的目标。
  • 嗨@Someprogrammerdude。感谢您的答复。我把数组改成了char **arr = (char **)malloc (1000 * sizeof (char *));现在怎么用fscanf?

标签: c arrays text


【解决方案1】:

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

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

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

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

char words[1000][30];

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

【讨论】:

  • 嗨@unwind,如果我有 char words[1000][30],我将如何使用 fscanf 实现循环?谢谢!
  • @novice usechar words[1000][100]; seconds 维度 100 显示每行字符,1000 显示行数。你可以使用this code
猜你喜欢
  • 1970-01-01
  • 2016-01-24
  • 2020-08-04
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2022-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多