首页 > 解决方案 > 如何将单词对从文件存储到字符串?

问题描述

我必须从输入文件中读取并将单词对存储在动态分配的字符串中。我们必须创建一个 typedef 结构并分别存储第一个和第二个单词

该文件如下所示:

car couch   \n
  golf ball\n   
mechanic repair\n 

这些对由一个空格分隔,但在单词对之前和之后可以有尽可能多的 hitespaces。

最后我应该有 2 个字符串“汽车高尔夫球技工”和“沙发球修理”

typedef struct _VocabularyCouple_
  {
    char* first_word;
    char* second_word;
  } VocabCouple;

int main(int argc, char* argv[])
{
  FILE *fp;
  char* filename;
  filename = argv[1];
  fp = fopen(filename,"r");

  VocabCouple voc_pair[10];

  int count = 0;

  char first_word[10];
  char second_word[10]; //the strings have to start with size of 10 
                   // and then if neede be enlarged by 10

  while(!feof(fp))
  {
    fscanf(fp," %s %s", 1_word, 2_word); // to skip whitespaces ?
    // I don't know how to enlarge if the word is bigger than 10

    voc_pair[count].first_word = 1_word; //?? don't know if right method
  }
}



正如你所看到的,我完全不知道如何实现这样的事情。任何帮助表示赞赏

标签: c

解决方案


我不建议使用while(!feof(fp)).

如果文件的长度是可变的,我会计算所有换行符(fgetc无论你喜欢还是喜欢),然后回到开头。然后,一旦有了行数,就可以遍历它,然后使用它fscanf来获取单词对。

我相信 1_word 是一个占位符,但这是 C 中的无效标识符,也不是您之前声明的标识符(first_word)。

并且voc_pair[count].first_word = 1_word;是正确的方法,你只需要记住count在插入第一个单词和第二个单词后递增。

我还建议删除该filename变量或将其声明移动到宏中,例如#define FILENAME argv[1],或者只定义一个具有文件名参数索引的常量。

您也不应该_在 a 的开头使用struct,或者在 C 中与此相关的任何内容,因为它是保留的,通常用于操作系统代码或其他您不想弄乱的东西。

关于如果单词大于 10 个字符则扩大字符串,您可以使用 realloc 并char*为单词动态分配 a,并插入您自己的零终止符。您可以剪切空白字符并插入您自己的分隔符,然后将每个字符串读入一个数组。

要跳过额外的空格,我将创建一个单独的函数,它fgetc与字符变量和位置变量一起使用,在每个新字符上增加位置变量。然后,您可以使用isspace它来检查它是否是空格,然后丢弃该字符。

希望这有帮助!


推荐阅读