一个循环比它应该少一次迭代

时间:2014-03-28 19:38:28

标签: c++

在处理我希望在每一行输入上执行的不同事情时,我偶然发现了一个问题 - 一个简单的代码说明了我的意思如下:

#include<cstdio>
using namespace std;

int main()
{
    char testCstring[100];
    int howManyLines;

    scanf("%d", &howManyLines);
    for(int i = 0; i < howManyLines; ++i)
    {
        fgets(testCstring, 100, stdin);
    }
}

所以它非常基本 - 只需迭代howManyLines次从输入中读取一行(当然通常我稍后会用它执行一些操作,只需将其剪切掉以显示问题) )。令我惊讶的是,它总是运行一次比它应该少的迭代,因此如果我给他1,我就不输入任何行。怎么会?当然,用printf代替fgets会使循环行为正常。为什么它在这里跳过一次迭代?

2 个答案:

答案 0 :(得分:4)

尝试将scanf("%d")更改为scanf("%d\n")。否则它将读取数字后面的任何内容(可能是一个空字符串)作为第一行。

答案 1 :(得分:0)

这很有趣!

stdin不是空的 - 在输入你按下的数字后返回并且新行char仍然在stdin中。

如果你想使用cstdio,你必须清理&#39;流。

#include<cstdio>
using namespace std;

int main()
{
    char testCstring[100];
    char c;
    int howManyLines;

    scanf("%d", &howManyLines);

    while ((c = getchar()) != '\n' && c != EOF);

    for(int i = 0; i < howManyLines; ++i)
    {
        fgets(testCstring, 100, stdin);
    }
}