Проверка нецелочисленного ввода с помощью >> chain (C ++) - PullRequest
0 голосов
/ 09 марта 2020

У меня есть следующий код:

#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
#include <cmath>
#include "functions.h"

using namespace std;

int main() {

  int Width = 0;
  int Height = 0;

  cout << "Input filename: ";
  cin >> filename;
  cout << "Input width and height: ";
  cin >> Width >> Height;


//check if input is non-integer

   if (!cin) {
    cout << "Error: width is a non-integer value" << endl;
    exit(1); }

  else if (!cin) {
    cout << "Error: height is a non-integer value" << endl;
    exit(1);
  }

Я пытаюсь проверить, являются ли ширина и высота int входными или нет. С помощью этого кода я получаю сообщение «Ошибка: ширина не является целочисленным значением», даже если ширина действительно целое число, и я ввожу не целое число для высоты. Каким образом я могу просто проверить, являются ли эти входные значения целочисленными или нет, не обнаружив этой ошибки? Спасибо!

1 Ответ

0 голосов
/ 09 марта 2020

Если вы хотите sh, чтобы пользователь мог ввести любое значение, то лучше всего получить их в std::string. Затем вы можете выполнить любой вид проверки для предоставленного ввода.

bool IsValidInt(const std::string & str)
{
    for (auto i = 0; i < str.size(); i++)
    {
        if (!isdigit (str[i]))
        {
            // If a single non-digit character is found, 
            // then provided input is not integer
            return false;
        }
    }

    return true;
}

Затем во время извлечения ввода от пользователя вы можете сделать что-то вроде этого:

std::string heightStr;
cin >> heightStr
if(IsValidInt(heightStr))
{
    // If input has all digits, convert to int
    int height = stoi(heightStr);
}
else
{
    cout << "Error: width is a non-integer value" << endl;
}
...