循环比预期少工作一次

A loop works one iteration less than it should

本文关键字:一次 工作 循环      更新时间:2023-10-16

在处理我想对每一行输入执行的不同操作时,我偶然发现了一个问题——下面的一段简单代码说明了我的意思:

#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可以使回路正常工作。为什么它在这里跳过一次迭代?

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

真有意思!

stdin不为空-在输入数字后按回车键,新的行字符仍然在stdin中。

如果你想使用cstdio,你必须'清理'流。

#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);
    }
}