我对打印有点困难。基本上,我有代码,我将值分配给bestmatch[]
,它被定义为line_t
类型(参见底部的结构)。
如您所见,我正在存储bestmatch[].score (double)
,bestmatch[].index (int)
和bestmatch[].buf (string)
的值。当我打印它们时,在下面的第二个代码块中显示,bestmatch[i].index
和bestmatch[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);
答案 0 :(得分:1)
你需要复制字符串的内容,而不仅仅是指针,因为它们在打印之前似乎被破坏,释放或残缺:
bestmatch[j].buf = strdup(linePtr->buf);
不要忘记在最后释放复制的字符串。
答案 1 :(得分:0)
getline
函数是从流中读取文本行的首选方法。
其他标准功能,例如gets
,fgets
和scanf
,有点太不可靠了。
getline
函数从流中读取整行,直到并包括下一个换行符。
此功能有三个参数:
指向分配有malloc
或calloc
的内存块的指针。此参数的类型为char**
,当函数返回时,它将包含getline
读取的行。
指向size_t
类型变量的指针。此参数指定第一个参数指向的内存块的大小(以字节为单位)。
从中读取该行的流。
第一个参数 - 指向分配有malloc
或calloc
的内存块的指针 - 仅仅是一个建议。函数getline
将根据需要通过realloc
自动扩大内存块,因此永远不会缺少空间 - 这个函数非常安全的一个原因。不仅如此,它还会通过更新第二个参数中返回的值来告诉您块的新大小。
话虽如此,每次你都会调用函数getline
,首先需要:
将maxSz
设置为合理的大小。
设置line.buf = malloc(maxSz)
。
设置maxSz
的值不要太大,以减少使用的冗余内存量。
将maxSz
的值设置得不会太小,以减少getline
次调用realloc
的次数。