Поскольку этот вопрос задают каждую неделю, этот FAQ может помочь многим пользователям.
Как преобразовать целое число в строку в C ++
как преобразовать строку в целое число в C ++
как преобразовать число с плавающей запятой в строку в C ++
как преобразовать строку в число с плавающей запятой в C ++
Ответы:
Обновление для C ++ 11
Как
C++11
правило, преобразование строки в число и наоборот встроено в стандартную библиотеку. Все следующие функции присутствуют в<string>
(согласно параграфу 21.5).строка в число
Каждый из них принимает на вход строку и пытается преобразовать ее в число. Если не удалось создать допустимое число, например, из-за отсутствия числовых данных или из-за того, что число выходит за пределы диапазона для типа, создается исключение (
std::invalid_argument
илиstd::out_of_range
).Если преобразование прошло успешно, но
idx
не было0
,idx
будет содержаться индекс первого символа, который не использовался для декодирования. Это может быть индекс за последним символом.Наконец, целочисленные типы позволяют указать основание, для цифр больше 9 предполагается алфавит (
a=10
доz=35
). Вы можете найти дополнительную информацию о точном форматировании, которое можно проанализировать здесь для чисел с плавающей запятой , целых чисел со знаком и целых чисел без знака .Наконец, для каждой функции есть перегрузка, которая принимает в
std::wstring
качестве первого параметра.числовой в строку
Это более просто: вы передаете соответствующий числовой тип и получаете обратно строку. Для параметров форматирования вам следует вернуться к параметру stringsream C ++ 03 и использовать манипуляторы потоков, как описано в другом ответе здесь.
Как отмечено в комментариях, эти функции возвращаются к точности мантиссы по умолчанию, которая, вероятно, не является максимальной точностью. Если для вашего приложения требуется более высокая точность, также лучше вернуться к другим процедурам форматирования строк.
Также определены похожие функции с именами
to_wstring
, они возвращаютstd::wstring
.источник
std::to_string
теряет большую точность для типов с плавающей запятой. Например,double f = 23.4323897462387526; std::string f_str = std::to_string(f);
возвращает строку 23,432390. Это делает невозможным получение значений с плавающей запятой в оба конца с помощью этих функций.sprintf(buf, fmt, val)
со спецификатором формата «% d » , «% u » , «% ld » , » % lu " , "% lld " , "% llu " , "% f " , "% f " или "% Lf " соответственно, гдеbuf
обозначает внутренний символьный буфер достаточного размера. "Я взглянул на стандарт C99 для printf и думаю, что количество десятичных знаков зависит от#define DECIMAL_DIG
infloat.h .Как преобразовать число в строку в C ++ 03
itoa
илиitof
функциюпотому что они являются нестандартными и поэтому непереносимыми.Использовать строковые потоки
Обратите внимание, что вы можете использовать строковые потоки также для преобразования чисел с плавающей запятой в строку, а также для форматирования строки по своему усмотрению, как и с
cout
Вы можете использовать манипуляторы потоков, такие как
std::endl
,std::hex
и функцииstd::setw()
иstd::setprecision()
т. Д., Со строковыми потоками точно так же, как сcout
Не путайте
std::ostringstream
сstd::ostrstream
. Последний не рекомендуетсяИспользуйте усиление лексики . Если вы не знакомы с ускорением, рекомендуется начать с небольшой библиотеки, такой как lexical_cast. Чтобы загрузить и установить boost и документацию к нему, перейдите сюда . Хотя boost не входит в стандарт C ++, многие библиотеки boost со временем стандартизируются, и boost широко считается одной из лучших библиотек C ++.
Лексическое приведение использует потоки внизу, поэтому в основном этот вариант такой же, как и предыдущий, только менее подробный.
Как преобразовать строку в число в C ++ 03
Самый легкий вариант, унаследованный от C, - это функции
atoi
(для целых чисел (от алфавита до целого)) иatof
(для значений с плавающей запятой (от алфавита до числа с плавающей запятой)). Эти функции принимают строку в стиле C в качестве аргумента (const char *
), и поэтому их использование может считаться не совсем хорошей практикой C ++. На cplusplus.com есть легкая для понимания документация как по atoi, так и по atof, включая то, как они ведут себя в случае неправильного ввода. Однако ссылка содержит ошибку, согласно которой, согласно стандарту, если входное число слишком велико, чтобы соответствовать целевому типу, поведение не определено.Используйте строковые потоки (на этот раз входной строковый поток
istringstream
). Опять же, istringstream используется точно так же, какcin
. Опять же, не путайтеistringstream
сistrstream
. Последний не рекомендуется.Используйте усиление лексики .
В случае неправильного ввода
lexical_cast
выдает исключение типаboost::bad_lexical_cast
источник
atoi
не превосходна, это неверно. Не упоминается, что если числовое значение строки не может быть представлено вint
, то поведение не определено. Вместо этого он говорит, что значения, выходящие за пределы допустимого диапазона, фиксируются доINT_MAX
/INT_MIN
, чего я не могу найти ни в C ++ 03, ни в C89. Для ненадежных / непроверенных входных данных или при работе с базами, которые потоки не поддерживают, вам нужноstrtol
, что определило поведение ошибки. И аналогичные комментарии дляatof
/strtod
.(int)strtol(nptr, (char **)NULL, 10)
. Функции atoi [...] возвращают преобразованное значение.». cplusplus.com известен как невероятно плохой источник информации для новичков.istr >> i1 >> f >> i2;
сильно пропускает проверку на успех.std::to_string
В C ++ 17 новые функции std :: to_chars и std :: from_chars представлены в заголовке charconv .
Из std :: to_chars , то же самое для std :: from_chars .
Хотя это не полностью реализовано компиляторами, оно обязательно будет реализовано.
источник
Я украл этот удобный класс откуда-то здесь, в StackOverflow, чтобы преобразовать все, что можно потоково, в строку:
И затем вы используете его как;
Отлично!
Также я использую эту функцию для преобразования строк во что-либо потоковое, хотя это не очень безопасно, если вы попытаетесь проанализировать строку, не содержащую числа; (и не такой умный, как предыдущий)
Использовать как:
Вам также могут понадобиться версии для wstrings.
источник