1. ホーム
  2. c++

[解決済み] cin.get()が動作しない

2022-02-07 10:13:29

質問

今日、こんな簡単なプログラムを書いてみたのですが cin.get() が2個ないと動作しません。何かいい方法はないでしょうか?

#include <iostream>
using namespace std;

int main(){
    int base;
    while ((base < 2) || (base > 36)){
          cout << "Base (2-36):" << endl; 
          cin >> base;
          }
    string base_str = "0123456789abcdefghijklmnopqrstuvwxyz";
    for (int i = 0; i < base; i++){
        for (int j = 0; j < base; j++){
            for (int k = 0; k < base; k++){    
                cout << base_str[i] << base_str[j] << base_str[k] << endl;
            }
        }
    }
    cin.get();
    cin.get();
}

を移動させると cin.get() をネストされたループの前に置くと、ループは実行された後、一時停止します。 cin.get() 私は、最新版の bloodshed c++ dev を使っています。

解決方法を教えてください。

変数 'base' を初期化していませんが、これはバグの原因になりますが、コンパイラによってはループをスキップしてしまうことがありますが、cin で見ている動作とは(直接)関係ありません。おそらくデバッグモードでゼロ初期化を行うか何かでビルドしているのでしょう。

とはいえ、それが修正されたとして。

値(例えば5)を入力してエンターキーを押すと、ストリーム内のデータは 5<newline> -- 演算子<<はストリームから改行を抽出しませんが、cin.get()は改行を抽出します。最初のcin.get()はストリームからその改行を抽出し、2番目のwaitはストリームが空になったので入力を待ちます。もし、1つのcin.get()呼び出ししかなかったら、それはすぐに改行を取り出して続行し、そのcin.get()呼び出しの後には何もないので、プログラムは終了します(そうあるべきです)。

デバッガから実行したときにプログラムが終了しないようにするために cin.get() を使用しているようです。通常、IDE から特定の "start without debugging" コマンドでこれを行うことができますので、この目的のために cin.get() を乱用する必要はないでしょう。