質問
今日、この簡単なプログラムを書いたのですが、次のことが分かりました。 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