题
我今天写了这个简单的程序,但我发现 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()
外出,程序才结束。我正在使用最新版本的流血C ++开发
解决方案
您不是在初始化“基本”变量,但这会导致错误(直接)与您在CIN看到的行为有关的错误,即使有时会根据编译器,因此会导致您跳过循环。您可能会以调试模式为零,以零定位。
也就是说,假设这是固定的:
当您键入一个值(例如5)并点击Enter时,流中的数据为 5<newline>
- 操作员<<不从流中提取新线,而是cin.get()。您的第一个cin.get()从流中提取该新线,第二个等待输入,因为流现在为空。如果您只有一个cin.get()呼叫,它将立即提取新线并继续,并且由于该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));
您需要第二次的原因 cin.get()
是,在您阅读 base
使用 cin
, , 一种 \n
留在缓冲区中。第一次打电话给 cin.get()
消耗了这一点 \n
和第二 cin.get
等待您的输入。为了避免这种情况,您需要冲洗 \n
从缓冲区之后 cin
通过打电话 cin.ignore
不隶属于 StackOverflow