使用文本文件中的字符串与使用文字字符串不同?

时间:2014-04-07 16:49:44

标签: c string pointers scanf

我有一个C程序,它从文本文件中读取字符串并使用它们来创建放置在哈希表(d_table)中的结构。它在循环中逐行读取文件。我得到的运行时问题是,使用从文件中获取的字符串添加的每个条目似乎仍然指向最近读取的内容(因此char word []将只是“。”),但是如果它是硬编码的话一些条目(如第二个ht_insert)然后它按预期完全工作。这让我觉得我错过了C处理字符串的方法......

文本文件的一行如下所示:“测试这是一个测试行”,最后一行是“。”

条目结构:

struct d_entry {
  char *word;
  char *desc;
};

我不认为问题是在create_entry或程序之外引起的,否则为什么硬编码的条目工作得很好?据我所知,除此之外,条目应该无法区分字符串是硬编码还是从文件中获取:

struct d_entry * create_entry(char *word, char*desc) {
  struct d_entry * e;
  e = (struct d_entry *) malloc(sizeof(struct d_entry));
  e->word = word;
  e->desc = desc;
  return e;
}

这是从文件读取的函数中获取的必要代码。我已经测试了很多,文件处理和从文件中提取字符串似乎工作正常:第一个ht_insert调用导致运行时问题,第二个调用是一个硬编码条目的例子,它完全正确地工作:

int read_from_file(const char * filename) {

  char word[40];
  char desc[200];

  FILE * fp;
  fp = fopen(filename, "r");

  fscanf(fp, "%s %[^\n]]", word, desc);

  while (word[0] != '.') {
    ht_insert (d_table, create_entry(word, desc)):
    ht_insert (d_table, create_entry("test", "test desc"));
    fscanf(fp, "%s %[^\n]", word, desc);
  }

fclose(fp);
return 1;
}

非常感谢任何帮助,谢谢。

2 个答案:

答案 0 :(得分:2)

create_entry(strdup(word), strdup(desc))

答案 1 :(得分:1)

使用strdup制作存储在数据结构中的每个字符串的堆副本。

对从文件(进入临时缓冲区)和静态字符串读取的两个字符串执行此操作。