質問

今日、この簡単なプログラムを書いたのですが、次のことが分かりました。 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() ネストされたループの前までは、ループが実行されてから一時停止します。一つ取ったら cin.get() プログラムは終了します。最新バージョンの bloodshed C++ dev を使用しています

役に立ちましたか?

解決

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

つまり、それが修正されたと仮定すると、次のようになります。

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

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

他のヒント

変数 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() それは、あなたが読んだ後です base 使用を使用します cin, 、a \n バッファに残されています。最初の呼び出し cin.get() それを消費します \n そして2番目 cin.get 入力を待ちます。これを避けるためには、洗い流す必要があります \n 後のバッファから cin 電話することによって cin.ignore

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top