6

私は今日この簡単なプログラムを書きましたが、2つ存在しない限り動作しないことがわかりましcin.get()た。何か案は?

#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()と、ループが実行されて一時停止します。1つcin.get()取り出すと、プログラムは終了します。最新バージョンのbloodshedc++devを使用しているim

4

2 に答える 2

5

「ベース」変数を​​初期化していませんが、それによってバグが発生しますが、コンパイラによってはループをスキップすることがありますが、cin で見られる動作とは (直接) 関連していません。 . おそらく、ゼロ初期化などのデバッグモードでビルドしています。

とはいえ、それが修正されたと仮定すると:

値 (たとえば 5) を入力して Enter キーを押すと、ストリーム内のデータは5<newline>-- operator<< はストリームから改行を抽出しませんが、cin.get() は抽出します。最初の cin.get() はストリームからその改行を抽出し、ストリームが空になったため、2 番目の待機は入力を待ちます。cin.get() 呼び出しが 1 回しかない場合は、すぐに改行を抽出して続行します。その cin.get() 呼び出しの後には何もないため、プログラムは終了します (当然のことです)。

cin.get() を使用して、デバッガーから実行したときにプログラムが閉じないようにしているようです。通常は、IDE から特定の「デバッグなしで開始」コマンドを使用してこれを行うことができます。この目的で cin.get() を悪用する必要はありません。

于 2010-09-23T16:11:19.907 に答える
4

変数baseが初期化されていません。

次のように無効な値を指定することで修正できますbase

int base = 1; // 1 is not in the valid range.
while ((base < 2) || (base > 36)){

また

do-while ループを次のように使用することをお勧めします。

int base;
do{
     cout << "Base (2-36):" << endl;
     cin >> base;
} while ((base < 2) || (base > 36));

2 番目が必要な理由は、を使用して値をcin.get()読み取った後、 aがバッファーに残っているためです。への最初の呼び出しはそれを消費し、2 回目は入力を待ちます。これを回避するには、呼び出した後にバッファからフラッシュする必要がありますbasecin\ncin.get()\ncin.get\ncincin.ignore

于 2010-09-23T16:03:58.427 に答える