掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
数値でなければ〜はどうすれば? (ID:69426)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
cin>> も scanf+%d も、その仕様として ・バッファに何もなければ、入力を待つ ・バッファに何かあれば、入力を待つ前にそのバッファ中の文字を使う ・数値として解釈できる文字列は数値に変換する(変換できた文字は処理済として取り除く) ・数値として解釈できない文字列は変換せず、そのままバッファに残す となっているわけだ。だから最初のコードと同等のもので例示すると cin >> x; // ここで数値と解釈されない文字を入力すると、それがバッファ中に残り cin >> y; // さてここでどう動くのか解説する // バッファ中の文字が残っているので入力待ちにならない // 数値に解釈できない文字をがバッファにあるので、それをまたバッファに残す cin >> z; // 同上 と動くのは当然の動作となる。 「ユーザの期待している動作」と「scanf/cin>> の動作」は異なる、と言い切っていいだろう。 ユーザの期待している動作は ・改行まで(改行を含む)の入力を受け取る ・数値に解釈できた文字列は処理済として捨てる ・数値に解釈できない文字列は不正入力として捨てる ・どっちであってもまた、改行までの入力を受け取る、に戻る で、この動作を実現するのにはいくつも手法があるわけだけれど 初心者にとって容易なのは ・改行までの文字列を、文字列として受け取る ・その文字列を数値として解釈する ・解釈結果の成功失敗に関係なく、その文字列を捨てる だと思う。 となると scanf %d や cin >> int の変数と書かないほうがいい。 stringstream を調べてみるといい。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.