无法弄清楚为什么我的打印语句会不断打印两次

时间:2020-10-17 04:35:06

标签: c

伙计们,所以我有正在使用的这段代码,它正在执行我需要做的所有事情,但是,我不知道为什么我的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

2 个答案:

答案 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();
}
相关问题