cin.get () не работает - PullRequest
       30

cin.get () не работает

5 голосов
/ 23 сентября 2010

Я написал эту простую программу сегодня, но обнаружил, что 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 ]

5 голосов
/ 23 сентября 2010

Вы не инициализируете переменную 'base', но, хотя это приведет к ошибкам, это (напрямую) не связано с поведением, которое вы видите с cin, хотя иногда это, в зависимости от компилятора, вызывает вас пропустить петли. Возможно, вы работаете в режиме отладки, который инициализируется нулями или что-то в этом роде.

Тем не менее, при условии, что это было исправлено:

Когда вы набираете значение (скажем, 5) и нажимаете ввод, данные в потоке имеют вид 5<newline> - оператор << не извлекает новую строку из потока, а cin.get () -. Ваш первый cin.get () извлекает эту новую строку из потока, а второе ожидание ожидает ввода, потому что поток теперь пуст. Если бы у вас был только один вызов cin.get (), он немедленно извлек бы новую строку и продолжил, и поскольку после этого вызова cin.get () ничего не происходит, программа завершается (как и должно быть). </p>

Похоже, вы используете cin.get (), чтобы остановить закрытие вашей программы при запуске из отладчика; обычно вы можете сделать это с помощью специальной команды «запустить без отладки» из вашей IDE; тогда вам не нужно злоупотреблять cin.get () для этой цели.

4 голосов
/ 23 сентября 2010

Переменная 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

...