伙计们,所以我有正在使用的这段代码,它正在执行我需要做的所有事情,但是,我不知道为什么我的printf两次打印出水平的东西。这是代码。
while(fgets(str_read, sizeof(str_read)-1 , fptr)!= NULL)
sscanf(str_read, "%d ", &somearray->level);
printf("level: %d\n", somearray->level);
如果还有其他问题,我可以在即时通讯上进行反馈。我正在使用.txt文件进行以下设置:
int
name
int
name
int
name
答案 0 :(得分:1)
您需要检查sscanf
的返回值。在不包含整数的行上,它将返回0
。在这种情况下,somearray->level
将保持不变,因此您将再次打印它。
一种可能的解决方案是:
while(fgets(str_read, sizeof(str_read)-1 , fptr)!= NULL)
if (sscanf(str_read, "%d ", &somearray->level) == 1)
printf("level: %d\n", somearray->level);
这将尝试每行sscanf
,但仅在找到值的情况下才打印结果。
另一种解决方案是跟踪偶数行与奇数行,并且仅在奇数行上尝试sscanf
。
答案 1 :(得分:0)
首先,我将假设您的代码在其周围有花括号,因为否则它将只在末尾打印一次(花括号控制循环主体中的内容,而不是缩进):
while(fgets(str_read, sizeof(str_read)-1 , fptr)!= NULL) {
sscanf(str_read, "%d ", &somearray->level);
printf("level: %d\n", somearray->level);
}
与您所看到的相吻合。如果您的文本文件由交替的整数和非整数的名称组成,则第二sscanf
会失败,因为名称不能被视为整数。由于您不检查返回值,因此您只能盲目地假设转换有效,并打印先前在somearray->level
中的值。
对scanf
函数家族的调用通常应包括检查以确保所有内容均已正确扫描,例如:
if (sscanf(str_read, "%d ", &somearray->level) != 1) {
handleBadScan();
}