6

私はC++を学び、小さなプログラムを書いています。以下はそのようなプログラムの1つです。

// 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->」を吐き出します。(この特定の入力シーケンスでは、プログラムの出力の速度が不規則に変化します。)また、大きな値の出力は、現在の不正な入力の値だけでなく、以前の正当な入力によって決定されることに気付きました。

どうしたの?(私はプログラムを修正することを気にしません、それは簡単です。私はそれを理解したいです。)

4

4 に答える 4

13

基本的に、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
        }
    }
}
于 2008-11-05T21:14:33.690 に答える
5

はい、エヴァン・テランはすでにほとんどのことを指摘しています。追加したいことの 1 つ (まだ彼のコメントにコメントできないため :)) は、istream::ignore への呼び出しの前に istream::clear への呼び出しを配置する必要があるということです。その理由は、ストリームがまだ失敗状態にある場合、 istream::ignore も同様に何もすることを拒否するためです。

于 2008-11-05T22:29:58.047 に答える
3

32ビットマシンを使用している場合、10000000000は整数で表すには大きすぎる数値です。また、intをcharに変換すると、コンパイラに応じて0..255または-128..127からしか得られません。

于 2008-11-05T21:14:05.160 に答える
0

ここでの問題charの1つは、aのサイズが1バイトであるため、-127〜128の数値しか保持できないことintです。一方、anは通常4バイトであり、はるかに大きな値を取る可能性があります。2番目の問題は、。に対しても大きすぎる値を入力していることですint

于 2008-11-05T21:15:50.273 に答える