循环比预期少工作一次
A loop works one iteration less than it should
在处理我想对每一行输入执行的不同操作时,我偶然发现了一个问题——下面的一段简单代码说明了我的意思:
#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);
}
}
相关文章:
- 唤醒多个线程以在每个条件下工作一次
- 比较字符串的 GetLine 工作一次,然后比较之后不起作用
- WebKit2GTK+ "page-created"扩展只工作一次
- Atmel Studio 7:ASF 库提供的 USART 中断处理程序仅在 main() 中遇到无限循环时工作一次?
- 在循环工作时,首先将两个文件读为向量,但仅次于迭代一次
- C :用sizeof()operator在for for loop中增加一个int变量,只能工作一次
- 如何在 c++ 中为我的游戏制作计时器,每 30 秒工作一次
- Cython导入只工作一次,然后会出现gcc.bat错误
- 共享/独占锁定,其中共享工作只能执行一次
- C++11:条件变量只工作一次
- 使用 std::ofstream 只能工作一次
- 为什么 _kbhit() 在 C 程序中只工作一次
- 问名字,如果错了再问一次,如果对了,继续(不工作)C++
- 在文件中插入文本只工作一次
- C++ SQLite 查询只工作一次。我的代码有什么问题?
- OpenGL:一次只能有一个FBO工作
- boost::timed_wait中的Notify条件变量只工作一次
- 加速 IOSTREAMS:output_filter只能工作一次
- 默认按钮只工作一次
- ios::right只在c++中工作一次