cin.get()不起作用

时间:2010-09-23 16:02:18

标签: c++ syntax syntax-checking

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

2 个答案:

答案 0 :(得分:5)

你没有初始化'base'变量,但是虽然这会导致bug,但它并没有(直接)与你用cin看到的行为相关,即使它有时会根据编译器导致你跳过循环。您可能正在调试模式下构建零初始化或其他东西。

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

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

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

答案 1 :(得分:4)

变量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