cin.get() не работает
-
04-10-2019 - |
Вопрос
Сегодня я написал эту простую программу, но обнаружил, что 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