我今天写了这个简单的程序,但我发现 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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top