{
int n;
cin>>n;
cout<< n;
}
any alphabet or special character
が入力された場合の出力は0
です。int dataypeとcin機能の混同
私は、scanf();
とprintf()
を使用したケースではありません。対応するASCII値を出力します。
なぜこのようなことが起こっているのか説明してください。
{
int n;
cin>>n;
cout<< n;
}
any alphabet or special character
が入力された場合の出力は0
です。int dataypeとcin機能の混同
私は、scanf();
とprintf()
を使用したケースではありません。対応するASCII値を出力します。
なぜこのようなことが起こっているのか説明してください。
CとC++の両方で、整数を入力すると、ドライバ入力関数は、数値ではない文字が読み取られるまで数字を読み取ります。
たとえば、"123GHI"
というシーケンスは、値123
を返します。
ちょうど尋ねると、 –
私はそう思っています。入力プロセスは関数であり、通常関数は値を返します。 –
"*出力する必要があります**値123 *"がより正確になります。出力値は必ずしも関数の戻り値ではなく、戻り値ではなく参照パラメータを介して解析された値が出力されるため、確かに 'operator >> 'の場合に当てはまります。 –
なぜこのようなことが起こっているのか説明してください。
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."
}
@クエンティンTHX、私はそこでその定式化に悩まされてきました。 –
C++ 11以降で動作が少し異なります: "*抽出が失敗した場合、**は値**に書き込まれ、フェイルビットは設定されます。*" –
@remyそれを採用しました。 –
をあなたのためにドキュメントを確認しましたint >>>のオーバーロード?そして、C!= C++に注意してください。 – Carcigenicate
値を入力した後、 'cin'の状態をチェックすることができます。 –
@πάνταῥεῖcout << cin.fail(); 1を与える。 numが0のときのみ0を返します。なぜ失敗したのか? – MELWIN