循环比预期检查空行的时间更长

时间:2017-11-29 23:12:44

标签: c string while-loop scanf

我有一个循环,一旦标志设置为1就会停止。

1 0
1 1
1 2
1 3

每次循环从每行输入扫描2个数字,直到没有剩余的输入行。我认为这样可以正常工作但我在测试以下输入时遇到了问题:

1,0.
1,1.
1,2.
1,3.

输出应为

1,0.
1,1.
1,2.
1,3.
1,3.

但是它会像这样打印最后一个循环两次:

$ python producer.py

为什么在终止之前扫描最后一行两次?是否有一个我可以检查的角色,所以它在打印出第一个" 1,3后会结束。"?

2 个答案:

答案 0 :(得分:1)

我会建议类似的东西

int main(){
    int next,next1;
    scanf("%d", &next);
    scanf("%d", &next1);
    while (getchar()=='\n') {
        printf("%d,%d.\n",next,next1);
        scanf("%d", &next);
        scanf("%d", &next1);
    }
}
通过这种方式,您可以节省一点内存,并且更具可读性。输出现在应该是正确的,请自己尝试。

答案 1 :(得分:0)

scanf() -

  

如果在读取时发生读取错误或达到文件结尾,则设置正确的指示符(feof或ferror)。并且,如果在成功读取任何数据之前发生任何一次,则返回EOF。

因此,当输入中没有更多行时,scanf()返回EOFwhile循环,因为done未设置为1然而,printf()再次打印存储在nextnext1中的值。这就是为什么最后输入的值打印两次。在此之后,条件if (getchar()=='\n')失败并且done设置为1并且while循环退出。

你可以这样做:

int done=0,next,next1;
while (done==0) {
    if (scanf("%d%d", &next, &next1) != EOF)
        printf("%d,%d.",next,next1);
    else
        done=1;
}

或者

while (scanf("%d%d", &next, &next1) != EOF)
    printf("%d,%d.",next,next1);