Как разобрать строку, содержащую целое число, и проверить, больше ли максимум в c ++ - PullRequest
1 голос
/ 10 октября 2019

Я хочу определить (в c ++), содержит ли строка число, которое находится в диапазоне 0 - UINT_MAX, я пробовал atoi и т. Д., Но это не обрабатывает этот случай. Например, строка 42949672963 не пройдёт тест. У кого-нибудь есть предложения?

Ответы [ 3 ]

2 голосов
/ 10 октября 2019

Вы можете использовать стандартную функцию C ++ std::strtoul, а затем проверить, не превышает ли преобразованное число std::numeric_limits<unsigned int>::max().

Например,

#include <iostream>
#include <string>
#include <stdexcept>
#include <limits>

int main() 
{
    std::string s( "42949672963" );
    unsigned int n = 0;

    try
    {
        unsigned long tmp = std::stoul( s );

        if ( std::numeric_limits<unsigned int>::max() < tmp )
        {
            throw std::out_of_range( "Too big number!" );
        }

        n = tmp;
    }
    catch ( const std::out_of_range &e )
    {
        std::cout << e.what() << '\n';
    }

    std::cout << "n = " << n << '\n';

    return 0;
}

Вывод программы:

Too big number!
n = 0

Вы также можете добавить еще один улов для недопустимых представлений чисел.

Другой способ - использовать стандартную функцию C strtoul, если вы не хотите иметь дело с исключениями.

0 голосов
/ 10 октября 2019

Вы можете искать строку за символом в цикле, и каждый раз, когда у вас появляются непрерывные цифры, вы можете создавать целое число и в то же время проверять с помощью Max UINT.

0 голосов
/ 10 октября 2019

Современным способом является использование std :: stoi, std :: stoll и т. Д.

Существуют перегрузки для строки и строки, и они могут обрабатывать большие размеры.

https://en.cppreference.com/w/cpp/string/basic_string/stol

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...