这个问题已经有一个答案在这里:

我在学习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.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top