Вопрос

Сегодня я написал эту простую программу, но обнаружил, что 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() выходит, программа просто заканчивается.Я использую последнюю версию Bloodshed C++ dev

Это было полезно?

Решение

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

Тем не менее, если предположить, что это исправлено:

Когда вы вводите значение (скажем, 5) и нажимаете Enter, данные в потоке 5<newline> --operator<< не извлекает новую строку из потока, а 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 AS:

int base;
do{
     cout << "Base (2-36):" << endl;
     cin >> base;
} while ((base < 2) || (base > 36));

Причина, по которой вам нужен 2-й cin.get() Это, после того, как вы прочитали base значение с использованием cin, А. \n остается в буфере. Первый звонок к cin.get() потребляет это \n и 2-й cin.get ждет вашего ввода. Чтобы избежать этого вам нужно промыть \n из буфера после cin Позвонив cin.ignore

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top