Обнаружить пустой ввод по переменной типа integer? - PullRequest
0 голосов
/ 03 марта 2019

В настоящее время я работаю над текстовой приключенческой игрой в качестве проекта для класса.У меня в основном все началось и работает нормально.Единственная проблема заключается в том, что, когда я спрашиваю пользователя, на какую комнату он хочет перейти, если он вводит пустой ввод, то должно выводиться сообщение «Вы должны выбрать комнату».Для жизни я не могу понять это.Любая помощь очень ценится.

Код:

#include <iostream>
#include <cstdlib>
#include <ctime>

using namespace std;

int main() {

bool game_play = true;
bool game_start = true;
int room_change;
int room_current = 0;

while (game_play == true) {
    if (game_start == true) {
        srand((unsigned int)time(NULL));
        room_change = rand() % 2 + 1;
        game_start = false;
    }
    else {
        for (bool check = false; check == false;) { // Check if input is invalid
            cin >> room_change;
            if (cin.fail()) {
                cout << "Choose an existing room.";
                cin.clear();
                cin.ignore();
            }
            else if (room_change == room_current) {
                cout << "You're already in that room.";
            }
            else {
                check = true;
            }
        }
    }
    switch (room_change) {
    case 1:
        cout << "You are in room 1.";
        room_current = 1;
        break;
    case 2:
        cout << "You are in room 2.";
        room_current = 2;
        break;
    case 3:
        game_play = false;
        break;
    default:
        cout << "That room doesn't exist.";
    }
}
return 0;
}

Ответы [ 3 ]

0 голосов
/ 03 марта 2019

Я только что запустил ваш код, и когда вы нажмете клавишу ввода, он будет ждать, пока вы не введете число или что-то недопустимое, например символ или строку.Я обнаружил, что если вы измените свой код с

cin >> room_change;

на

cin >> noskipws >> room_change;

, когда пользователь введет пробел, это приведет к тому, что cin.fail () вернет true, а затемперейдите к печати «Выберите существующую комнату».

В вашей ситуации цикл while будет вызываться до тех пор, пока мы не получим действительный ввод.«Выбрать существующую комнату» действительно повторяется, потому что room_change является целым числом, поэтому, когда мы нажимаем Enter, в буфере остается «\ n».Затем цикл while на следующей итерации читает это '\ n' и выполняет cin.fail (), прежде чем позволить вам ввести что-то еще.Одно решение, которое я нашел, состоит в том, чтобы использовать больше операторов cin.ignore ().

for (bool check = false; check == false;) { // Check if input is invalid
    cin >> noskipws >> room_change;
    if (cin.fail()) {
        cout << "Choose an existing room.";
        cin.clear();
        cin.ignore();
    } else if (room_change == room_current) {
        cout << "You're already in that room.";
        cin.ignore();
    } else {
        check = true;
        cin.ignore();
    }
}

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

0 голосов
/ 03 марта 2019
#include <iostream>

using namespace std;

int main(){
    int room_change=200;

    cout<<"Enter Blank";
    cin>>room_change;

    if(room_change==NULL){
       cout<<"There is NO-THING"<<endl; 
    }

    if(room_change!=NULL){
       cout<<"There is something and that is :"<<room_change<<endl; 
    }


return 0;   
}

Но гораздо более простым подходом к этому было бы использование строк.Если это домашняя работа, и вы ограничены только целочисленной переменной.Это намного сложнее, если вы хотите определить, пуст ли буфер или нет.Независимо от ограничений домашней работы, ввод уровня ОС основан на строке. Как я могу использовать cin.get (), чтобы обнаружить пустой пользовательский ввод?

0 голосов
/ 03 марта 2019

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

Использование std::getline, а затем извлечение числа из строки с помощью std::istringstream - лучшая стратегия для этого.

std::string line;
std::cout << "Choose an existing room. ";
while ( std::getline(std::cin, line) )
{
   // Try to get the room_change using istringstream.
   std::istringstream str(line);
   if ( str >> room_change )
   {
      // Successfully read the room.
      break;
   }

   // Problem reading room_change.
   // Try again.
   std::cout << "Choose an existing room. ";
}
...