преобразование std :: string в int с использованием sstream

Я пытаюсь преобразовать строку произвольной длины в int, но пока она работает только для строк ограниченной длины. Код до сих пор:

long long convertToInt (std::string x){
long long number;
std::istringstream ss(x);
ss >> number;
return number;}

за x=100000000000000000000000001 функция возвращает 0, Может кто-нибудь объяснить, почему? Благодарю.

1

Решение

Встроенные целочисленные типы, предоставляемые вашим компилятором, гарантированно будут способны хранить числа определенной величины. Похоже, ваш номер больше этого. Вы можете обнаружить, что программа C ++ сообщает об ошибке — попробуйте …

if (ss >> number)
return number;
throw std::runtime_error("conversion of string to int failed");

…или любой другой обработки ошибок, которую вы чувствуете.

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

1

Другие решения

Значение "100000000000000000000000001" является большим, чтобы вписаться в long long (или же unsigned long long), поэтому извлечение не удается.

использование numeric_limits чтобы определить максимальное значение для типов в вашей реализации:

#include <limits>

std::cout << std::numeric_limits<unsigned long long>::max() << "\n";
std::cout << std::numeric_limits<long long>::max() << "\n";
std::cout << "100000000000000000000000001\n";

печатает:

18446744073709551615
9223372036854775807
100000000000000000000000001

Проверьте результат попытки извлечения, чтобы убедиться, что извлечение произошло:

if (ss >> number)
{
return number;
}
// Report failure.
5

По вопросам рекламы [email protected]