2017-02-28 5 views
-3
{ 

int n; 
cin>>n; 
cout<< n; 

} 

any alphabet or special characterが入力された場合の出力は0です。int dataypeとcin機能の混同

私は、scanf();printf()を使用したケースではありません。対応するASCII値を出力します。

なぜこのようなことが起こっているのか説明してください。

+0

をあなたのためにドキュメントを確認しましたint >>>のオーバーロード?そして、C!= C++に注意してください。 – Carcigenicate

+1

値を入力した後、 'cin'の状態をチェックすることができます。 –

+0

@πάνταῥεῖcout << cin.fail(); 1を与える。 numが0のときのみ0を返します。なぜ失敗したのか? – MELWIN

答えて

0

CとC++の両方で、整数を入力すると、ドライバ入力関数は、数値ではない文字が読み取られるまで数字を読み取ります。

たとえば、"123GHI"というシーケンスは、値123を返します。

+0

ちょうど尋ねると、 –

+0

私はそう思っています。入力プロセスは関数であり、通常関数は値を返します。 –

+0

"*出力する必要があります**値123 *"がより正確になります。出力値は必ずしも関数の戻り値ではなく、戻り値ではなく参照パラメータを介して解析された値が出力されるため、確かに 'operator >> 'の場合に当てはまります。 –

1

なぜこのようなことが起こっているのか説明してください。 std::istream& operator>>(std::istream&, int)documentation

ことが述べられています(強調鉱山):(数字が予想される場合、文字が入力された場合など)

抽出に失敗した場合は

値がそのまま残されているフェイルビットが設定されます。初期化が保証されているようだC++ 11のコードについては

抽出に失敗した場合は、ゼロ値に書き込まれ、、failbitが設定されます。抽出結果の値が大きすぎるか小さすぎて値に収まらない場合は、std::numeric_limits<T>::max()またはstd::numeric_limits<T>::min()が書き込まれ、failbitフラグが設定されます。あなたのコードのデバッグビルドを実行する想定

は、nは、おそらく自動的に0で初期化されますが、それはあなたが記述その場合にはinitalizedていなかったので、技術的にアクセスするには、未定義の動作です。

あなたは障害が番号抽出中に発生したかどうかを検出するために、またはあなたが安全になりました、初期化された値を使用できる場合は、入力した後cinの状態を確認する必要があります。

int n; 
std::cin >> n; 
if(std::cin) { 
    std::cout << n << std::endl; 
} 
else { 
    std::cin.clear(); // Clear the streams fail state 
    std::string dummy; 
    std::cin >> dummy; // Consume the non numeric input 
    std::cout << "Wrong input, '" << dummy << "' is not a number." 
} 
+1

@クエンティンTHX、私はそこでその定式化に悩まされてきました。 –

+0

C++ 11以降で動作が少し異なります: "*抽出が失敗した場合、**は値**に書き込まれ、フェイルビットは設定されます。*" –

+0

@remyそれを採用しました。 –

関連する問題