6

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

如果我将 acin.get()移到嵌套循环之前,则循环运行然后暂停。如果我拿出一个cin.get(),程序就结束了。我正在使用最新版本的流血 c++ dev

4

2 回答 2

5

您没有初始化“基本”变量,但是虽然这会导致错误,但它与您在 cin 中看到的行为没有(直接)相关,即使有时会导致您跳过循环,具体取决于编译器. 您可能正在构建零初始化或其他东西的调试模式。

也就是说,假设这是固定的:

当您键入一个值(例如 5)并按 Enter 键时,流中的数据是5<newline>-- operator<< 不会从流中提取换行符,但 cin.get() 会。您的第一个 cin.get() 从流中提取换行符,第二个等待等待输入,因为流现在是空的。如果您只有一个 cin.get() 调用,它将立即提取换行符并继续,并且由于在 cin.get() 调用之后没有任何内容,因此程序终止(应该如此)。

从调试器运行时,您似乎正在使用 cin.get() 来阻止程序关闭;您通常可以通过 IDE 中的特定“不调试启动”命令来执行此操作;那么你不需要为此目的滥用 cin.get() 。

于 2010-09-23T16:11:19.907 回答
4

变量base尚未初始化。

您可以通过为 as 提供无效值来修复它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, a\n会留在缓冲区中。第一次调用会cin.get()消耗它\n,第二次调用会cin.get等待您的输入。为避免这种情况,您需要在调用\n后从缓冲区中刷新cincin.ignore

于 2010-09-23T16:03:58.427 回答