在处理我希望在每一行输入上执行的不同事情时,我偶然发现了一个问题 - 一个简单的代码说明了我的意思如下:
#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
会使循环行为正常。为什么它在这里跳过一次迭代?
答案 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);
}
}