C ++ Integer, за которым следует char, принимается в качестве входных данных - PullRequest
1 голос
/ 27 мая 2020

Я использую функцию, чтобы проверить, что мой ввод только целочисленный:

    int input;
    while (true)
    {
        std::cin >> input;
        if (!std::cin)
        {
            std::cout << "Bad Format. Please Insert an integer! " << std::endl;
            std::cin.clear();
            std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
            continue;
        }
        else
            return input;
    }

Однако при вводе целого числа, за которым следует символ, например. 3s , целое число принимается, и сообщение печатается.

Как я могу убедиться, что ввод в таком формате не принимается и не вводится в форме 4s 5, поэтому, когда после пробела стоит целое число.

Ответы [ 2 ]

5 голосов
/ 27 мая 2020

Это происходит из-за того, что символы в C ++ представлены их числовыми c значениями в таблице ascii, вы можете попробовать такие регулярные выражения, как это:

#include <regex>
#include <string>
    std::string str;
    std::regex regex_int("-?[0-9]");
    while (true)
    {
        std::cin >> str;
        if (regex_match(str, regex_int))
        {  
           int num = std::stoi(str);
           //do sth
           break;
        }
    }
0 голосов
/ 27 мая 2020

Нет необходимости в регулярном выражении, которое дублирует проверку, которую выполняет std::stoi. Просто используйте std::stoi:

std::string input;
std::cin >> input;
std::size_t end;
int result = std::stoi(input, &end);
if (end != input.size())
    // error
...