c++中的无限循环
infinite loop in c++
我正在学习C++,并在学习的过程中编写一些小程序。以下是一个这样的程序:
// This program is intended to take any integer and convert to the
// corresponding signed char.
#include <iostream>
int main()
{
signed char sch = 0;
int n = 0;
while(true){
std::cin >> n;
sch = n;
std::cout << n << " --> " << sch << std::endl;
}
}
当我运行这个程序并将输入保持在相当小的绝对值时,它的行为正如预期的那样。但是,当我输入更大的输入时,例如10000000000,程序会重复输出相同的输出。某些输入组合会导致不稳定的行为。例如:
#: ./int2ch
10
10 -->
10000000000
10 -->
10 -->
10 -->
10 -->
程序会吐出"10-->",直到它被杀死。(对于这种特定的输入序列,程序的输出速度会不稳定地变化。)我还注意到,大值的输出是由以前的合法输入和当前非法输入的值决定的。
怎么回事?(我不在乎修复程序,这很容易。我想了解它。)
基本上,cin
流处于失败状态,因此当您尝试读取它时会立即返回
#include <iostream>
int main()
{
signed char sch = 0;
int n = 0;
while(std::cin >> n){
sch = n;
std::cout << n << " --> " << sch << std::endl;
}
}
cin >> n
将返回对cin
的引用,您可以在条件中测试其"良好性"。所以基本上"while(std::cin >> n)
"是说"虽然我仍然可以成功地从标准输入中读取,但请执行以下操作"
EDIT:它重复输出最后一个输入的好值的原因是因为这是n中成功读取的最后一个值,失败的读取不会改变n 的值
编辑:正如评论中所指出的,你可以清除错误状态,然后再试一次,这样的操作可能会起作用,只需忽略坏数字:
#include <iostream>
#include <climits>
int main() {
signed char sch = 0;
int n = 0;
while(true) {
if(std::cin >> n) {
sch = n;
std::cout << n << " --> " << sch << std::endl;
} else {
std::cin.clear(); // clear error state
std::cin.ignore(INT_MAX, 'n'); // ignore this line we couldn't read it
}
}
}
是的,Evan Teran已经指出了大多数事情。我想补充的一件事(因为我还不能评论他的评论:)是,你必须把对istream::clear的调用放在对istream::ignore的调用之前。原因是如果流仍处于失败状态,istream::ignore同样会拒绝执行任何操作。
假设您在一台32位机器上,10000000000是一个太大的数字,无法用int表示。此外,根据编译器的不同,将int转换为char只会给出0..255或-128..127。
这里的一个问题是char
的大小为一个字节,因此只能容纳-127到128之间的数字。另一方面,int
通常是4个字节,并且可以具有更大的值。第二个问题是,即使对于int
,您输入的值也太大。
- 过载'operator new'如何导致无限循环?
- C++正则表达式无限循环
- 程序在尝试猜测它选择的随机数时进入无限循环?
- 遍历链表时的无限循环
- 循环链表:无限循环
- 比较两个字符串后卡在无限循环中
- 在做一段时间内检查字符的无限循环
- 逐字读取文本文件中的每一行并转换为 int(无限循环或崩溃?
- 在这个无限循环中,当输入 0 时终止,当输入 int 范围之外的任何内容时,程序行为不正常
- 可能的无限循环
- 超出 int 的值范围后的无限循环
- 为什么这段代码会导致无限循环?
- 运行无限循环的最小二叉树问题
- 在分配和发布递增循环迭代器时C++无限循环(gcc 错误?
- 连接线程时的无限循环
- 为什么这种方法会进入无限循环?
- 由于QTextStream的无限循环
- Qt 在另一个线程中无限循环
- 从文件 C++ 读取时的无限循环
- 试图找出为什么我的代码保持无限循环