使用getline()时打印问题

时间:2014-09-25 14:02:09

标签: c pointers struct printf

我对打印有点困难。基本上,我有代码,我将值分配给bestmatch[],它被定义为line_t类型(参见底部的结构)。

如您所见,我正在存储bestmatch[].score (double)bestmatch[].index (int)bestmatch[].buf (string)的值。当我打印它们时,在下面的第二个代码块中显示,bestmatch[i].indexbestmatch[i].score正确打印;但是,bestmatch[i].buf根本不打印。

只是为了更多地混淆事情(至少对我自己而言),如果我在scorecmp(第一个代码块)的末尾打印bestmatch[i].buf,它打印正常。我已经打电话给得分,从最底层开始参考。

为什么印刷指数和得分都很好,但不是buf?或者甚至更多,我该如何解决这个问题呢?

感谢您的帮助!如果您需要任何其他信息,请与我们联系

主要出现的印刷品如下(供参考,TOP_SCORING_MAX是bestmatch []中的元素数量):

int i;
for (i = 0; i<TOP_SCORING_MAX; i++) {
    if (bestmatch[i].score != -1) {
        printf("line\t%d, score = %6.3f and string is %s \n", 
            bestmatch[i].index,bestmatch[i].score, bestmatch[i].buf);
    }
}

如果你想要结构:

typedef struct line_t {
  char* buf;
  int lineLength;   
  int wordCount;
  int index;
  double score;
} line_t;

这是我对scorecmp的呼吁:

scorecmp(linePtr, bestmatch);

2 个答案:

答案 0 :(得分:1)

你需要复制字符串的内容,而不仅仅是指针,因为它们在打印之前似乎被破坏,释放或残缺:

 bestmatch[j].buf = strdup(linePtr->buf);

不要忘记在最后释放复制的字符串。

答案 1 :(得分:0)

getline函数是从流中读取文本行的首选方法。

其他标准功能,例如getsfgetsscanf,有点太不可靠了。

getline函数从流中读取整行,直到并包括下一个换行符。

此功能有三个参数:

  1. 指向分配有malloccalloc的内存块的指针。此参数的类型为char**,当函数返回时,它将包含getline读取的行。

  2. 指向size_t类型变量的指针。此参数指定第一个参数指向的内存块的大小(以字节为单位)。

  3. 从中读取该行的流。

  4. 第一个参数 - 指向分配有malloccalloc的内存块的指针 - 仅仅是一个建议。函数getline将根据需要通过realloc自动扩大内存块,因此永远不会缺少空间 - 这个函数非常安全的一个原因。不仅如此,它还会通过更新第二个参数中返回的值来告诉您块的新大小。


    话虽如此,每次你都会调用函数getline,首先需要:

    • maxSz设置为合理的大小。

    • 设置line.buf = malloc(maxSz)

    设置maxSz的值不要太大,以减少使用的冗余内存量。

    maxSz的值设置得不会太小,以减少getline次调用realloc的次数。