无限循环c++[重复]
-
06-07-2019 - |
题
这个问题已经有一个答案在这里:
我在学习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)
"是说"虽然我仍然可以从中读取标准输入了成功,做以下"
编辑:的原因,它一再输出最好的输入值是因为这是最后的价值成功地阅读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
}
}
}
其他提示
是的,埃文*特兰指出大多数事情了。有一件事我要添加(由于我不能评论他的评论尚未:))是你必须把电话给istream::清楚 之前 呼叫istream::忽视。其原因是,istream::忽略同样只会拒绝做任何事情,如果流仍处于失败状态。
鉴于你是在一个32位的机,10000000000太大一个数量是表示一个int.还将int char只会给你自0..255或在-128..127根据编译器。
一个问题是一个 char
有一个小的一个字节,因此可以只举行一数之间至127和128。一个 int
另一方面,通常为4个字节,和可以采取更大的价值。第二个问题是,你在输入值,是太大了甚至对一个 int
.