Как я могу принять целочисленный ввод при отклонении чисел с плавающей запятой и пробелов? - PullRequest
1 голос
/ 28 апреля 2019

У меня есть система создания меню с циклом для проверки ввода. Когда на входе указано что-то вроде «2.4» или «2 4», он принимает «2» в качестве первого ввода, тогда я предполагаю, что «4» сохраняется в буфере и автоматически передается как следующий ввод без ожидания.

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

Принимать только целое число для ввода

Как заставить cin брать только цифры

соответствующий код (извините, все еще пытаюсь выяснить форматирование):

int menu(std::vector <std::string> options) //menu creation
{
int input;             //user selection
bool check = false;    //check for valid input
.
.
.
  while(!check)
  {
    std::cin >> input;

    if(std::cin.fail() || input <= 0 || input > static_cast<int>(options.size()))
    {
      std::cin.clear();
      std::cin.ignore();
      std::cout << wrongInput << std::endl;
    }
    else
    {
      check = true;       //change flag for valid input
    }
  }
return input;
}

Я бы хотел, чтобы цикл полностью отвергал что-то не-int. Я попытался создать цикл, который проверял бы каждый символ последовательно, чтобы он принимал многозначные числа, а затем заканчивался пробелом "." или персонаж, но он был очень неуклюжим и все еще не работал должным образом.

1 Ответ

0 голосов
/ 28 апреля 2019

Вы можете прочитать одну строку, поместить ее в поток строк и затем использовать std::nows, чтобы убедиться, что пробел не разрешен. Чтобы убедиться, что после целого числа нет оставшихся символов, просто проверьте EOF.

#include <iostream>
#include <sstream>
#include <string>

int main() {
  std::string line;
  std::stringstream temp;
  std::getline(std::cin, line);
  temp << line;
  int value;
  temp >> std::noskipws >> value;
  if(!temp.fail() && temp.eof()) {
    std::cout << "Parsed a 'pure' int: " << value << std::endl;
  } else {
    std::cerr << "Expected <int>" << std::endl;
  }
}

Это позволит 123, 598324, но не <space>123 или 123.4

...