Преобразование строки в число и наоборот в C ++
В целом или, более конкретно, в конкурентном программировании есть много случаев, когда нам нужно преобразовать число в строку или строку в число. Но отсутствие знаний о некоторых важных инструментах обязывает нас сделать это. Некоторые методы для достижения этой задачи упоминаются в этой статье.
Преобразование строки в число
Метод 1 : Использование класса stringstream или sscanf ()
Метод 2 : Преобразование строки с использованием stoi () или atoi ()
Оба эти метода были подробно обсуждены в этой статье.
Метод 3: Использование лексического броска
Библиотека Boost предлагает встроенную функцию «lexical_cast (« string »)», которая напрямую преобразует строку в число. Возвращает исключение «bad_lexical_cast» в случае неверного ввода.
// C ++ код для демонстрации работы lexical_cast ()
#include<iostream>
#include <boost/lexical_cast.hpp>// for lexical_cast()
#include <string> // for string
using namespace std;
string str1 = «6.5» ;
// Инициализация f_value с помощью приведенного числа с плавающей точкой
// f_value равно 6,5
float f_value = boost::lexical_cast< float >(str1);
// Инициализация i_value с приведенным int
// i_value равно 5
int i_value = boost::lexical_cast< int >(str);
// Отображение приведенных значений
cout << «The float value after casting is : » ;
cout << «The int value after casting is : » ;
Преобразование числа в строку
Метод 1: Использование строковых потоков
В этом методе строковый поток объявляет объект потока, который сначала вставляет число в виде потока в объект, а затем использует «str ()» для внутреннего преобразования числа в строку.
// C ++ код для демонстрации метода строкового потока
// преобразовать число в строку.
#include<iostream>
#include <sstream> // for string streams
#include <string> // for string
using namespace std;
// объявляем поток выходной строки
// Отправка числа в виде потока в вывод
// str () переводит число в строку
string geek = str1.str();
cout << «The newly formed string from number is : » ;
Способ 2: использование to_string ()
Эта функция принимает число (может быть любого типа данных) и возвращает число в нужной строке.
Реализация:
// C ++ код для демонстрации метода to_string ()
// преобразовать число в строку.
#include<iostream>
#include<string> // for string and to_string()
using namespace std;
// Объявление целого числа
float f_val = 30.50;
// Преобразование int в строку с помощью
string stri = to_string(i_val);
// Преобразование числа с плавающей точкой в строку
string strf = to_string(f_val);
// Отображение преобразованных строк
cout << «The integer in string is : » ;
cout << «The float in string is : » ;
Метод 3: Использование лексического броска
Подобно преобразованию строк, функция ”lexical_cast ()” остается прежней, но этот список временных аргументов изменяется на “lexical_cast (numeric_var).
// C ++ код для демонстрации метода "lexical_cast ()"
// преобразовать число в строку.
#include <boost/lexical_cast.hpp> // for lexical_cast()
#include <string> // for string
using namespace std;
float f_val = 10.5;
// lexical_cast () преобразует число с плавающей точкой в строку
string strf = boost::lexical_cast<string>(f_val);
// lexical_cast () преобразует int в строку
string stri = boost::lexical_cast<string>(i_val);
// Отображение преобразованных строк
cout << «The float value in string is : » ;
cout << «The int value in string is : » ;
Эта статья предоставлена Манджитом Сингхом . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.
Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Конвертация строки в число
Помогал на днях одной своей знакомой разобраться в программировании. По ходу дела написали учебную программу, которая умеет конвертировать строку (string) в число (int). И как-то само собой захотелось сравнить скорость работы собственной нетленки, со скоростью работы стандартных инструментов (Convert.ToInt32 и Int32.Parse). Результат такого сравнения, на первый взгляд, получился несколько необычным.
Думаю, любой из вас сможет без особых проблем решить поставленную задачу, поэтому объяснять что и как работает смысла не вижу.
Сравнивать будем скорость работы следующих функций:
На моей машине (Windows 7, .NET 4.0, intel i5) при numbersCount=16 000 000 получаются в среднем следующие результаты:
ConvertTest: 08.5859994 секунды
MyConvertTest: 07.0505985 секунды
Если вместо Int32.Parse использовать Convert.ToInt32, то результат никак не изменится. Но это и понятно, если учесть, что функция Convert.ToInt32 сама вызывает Int32.Parse. Таким образом, получаем, что скорость работы собственного велосипеда быстрее скорости работы стандартной функции на
Если посмотреть документацию, то становится понятно, что функция Int32.Parse довольно сложная. В частности она умеет преобразовывать строковое представление числа с учетом региональных форматов. Хотя в моей практике этой функциональностью мне пользоваться не приходилось.
Попробуем сделать наше творение еще чуть более быстрее. Для этого в функции ToInt изменим цикл
В этом случае получаем:
MyConvertTest: 06.2629928 секунды
То есть теперь скорость работы нашей функции быстрее стандартной на
27%. Это довольно неожиданно. Я считал, что компилятор (или же CLR) сможет понять, что так как внутри цикла мы не изменяем переменную s, то значение s.Length будет получено только один раз.
Теперь попробуем вместо вызова функции CharToInt, встроить ее тело в функцию ToInt. В этом случае
MyConvertTest: 05.5496214 секунды
Так, скорость работы относительно стандартной функции увеличилась на
35%. Это тоже в свою очередь довольно неожиданно, так как компилятор (или CLR) в некоторых случаях самостоятельно может это сделать.
Уже почти все перепробовали. Осталось только попробовать отказаться от цикла for. Это можно сделать, например, следующим образом:
Результат:
MyConvertTest: 05.2410683 секунды
Это на
39% быстрее стандартной функции (и всего лишь на 3% быстрее варианта с for).
Выводы
- В некоторых случаях свои собственные творения могут работать лучше стандартных решений.
- В некоторых случаях выделение отдельной переменной для конечного значения цикла for (то есть замена «i < s.Length» на «i < length») может дать неплохой прирост в скорости (почти 10% в данном случае). Хотя это во многом зависит от настроения CLR.
- В некоторых случаях встраивание в функцию тела метода вместо вызова самого метода так же имеет значение. Хотя это так же зависит от настроения CLR.
Довольно часто в различной литературе встречаются вполне справедливые утверждения о том, что всю низкоуровневую оптимизацию нужно возложить на плечи компилятора и среды выполнения. Они мол достаточно интеллектуальные и сами лучше знают, как будет лучше. Однако, как показывают подобные тесты, оптимизация циклов и развертывание функций может обернуться 20-ти процентным приростом в скорости (если сравнить 1-й вариант).
Конечно же, заниматься оптимизацией нужно с умом. И далеко не всегда в реальных проектах усложнение сопровождения проекта может быть оправдано ускорением работы на несколько секунд.
UPD исправлена проблема с плюсом, спасибо.
UPD 2 it4_kp верно подметил, что во всех предложенный мной алгоритмах не работает
Действительно, int.MinValue по модулю на единицу больше, чем int.MaxValue. А так как в промежуточном вычислении в качестве буфера используется положительный диапазон от int, то модуль от int.MinValue в него не входит.
Одно из возможных решений: в качестве промежуточного буфера использовать отрицательный диапазон
Уже две ошибки в казалось бы примитивном коде. Дополнительная причина подумать прежде чем отказываться от стандартных библиотек.
Преобразование строки в число
Для преобразования строки в число используются следующие функции:
- atoi() — преобразует C-строку в число, имеющее тип int . Прототип функции:
Считывание символов производится пока они соответствуют цифрам. Иными словами, в строке могут содержаться не только цифры. Пробельные символы в начале строки игнорируются. Пример преобразования:
Если значение выходит за диапазон значений типа int , то в VC++ возвращается максимальное или минимальное значение типа int и переменной errno присваивается значение ERANGE :
В MinGW будет усечение значения:
- atol() — преобразует C-строку в число, имеющее тип long . Прототип функции:
Если значение выходит за диапазон значений типа long , то в VC++ возвращается максимальное или минимальное значение типа long и переменной errno присваивается значение ERANGE :
В MinGW будет усечение значения:
- atoll() — преобразует C-строку в число, имеющее тип long long . Прототип функции:
Если значение выходит за диапазон значений типа long long , то возвращается максимальное или минимальное значение типа long long и переменной errno присваивается значение ERANGE :
- _atoi64() — преобразует C-строку в число, имеющее тип __int64 . Прототип функции:
Если значение выходит за диапазон значений типа __int64 , то возвращается максимальное или минимальное значение типа __int64 и переменной errno присваивается значение ERANGE :
- strtol() и strtoul() — преобразуют C-строку в число, имеющее тип long и unsigned long соответственно. Прототипы функций:
Пробельные символы в начале строки игнорируются. Считывание символов заканчивается на символе не являющемся записью числа. Указатель на этот символ доступен через параметр endPtr , если он не равен NULL . В параметре radix можно указать систему счисления (число от 2 до 36 ). Если в параметре radix задано число 0 , то система счисления определяется автоматически. Пример преобразования:
Если в строке нет числа, то возвращается число 0 . Если число выходит за диапазон значений для типа, то значение будет соответствовать минимальному ( LONG_MIN или 0 ) или максимальному ( LONG_MAX или ULONG_MAX ) значению для типа, а переменной errno присваивается значение ERANGE . Пример:
- strtoll() и strtoull() — преобразуют C-строку в число, имеющее тип long long и unsigned long long соответственно. Прототипы функций:
Пробельные символы в начале строки игнорируются. Считывание символов заканчивается на символе не являющемся записью числа. Указатель на этот символ доступен через параметр endPtr , если он не равен NULL . В параметре radix можно указать систему счисления (число от 2 до 36 ). Если в параметре radix задано число 0 , то система счисления определяется автоматически. Пример преобразования:
Если в строке нет числа, то возвращается число 0 . Если число выходит за диапазон значений для типа, то значение будет соответствовать минимальному ( LLONG_MIN или 0 ) или максимальному ( LLONG_MAX или ULLONG_MAX ) значению для типа, а переменной errno присваивается значение ERANGE . Пример:
- _strtoi64() и _strtoui64() — преобразуют C-строку в число, имеющее тип __int64 и unsigned __int64 соответственно. Прототипы функций:
Пробельные символы в начале строки игнорируются. Считывание символов заканчивается на символе не являющемся записью числа. Указатель на этот символ доступен через параметр endPtr , если он не равен NULL . В параметре radix можно указать систему счисления (число от 2 до 36 ). Если в параметре radix задано число 0 , то система счисления определяется автоматически. Пример преобразования:
Если в строке нет числа, то возвращается число 0 . Если число выходит за диапазон значений для типа, то значение будет соответствовать минимальному или максимальному значению для типа, а переменной errno присваивается значение ERANGE . Пример:
- strtoimax() и strtoumax() — преобразуют C-строку в число, имеющее тип intmax_t и uintmax_t соответственно. Прототипы функций:
Пробельные символы в начале строки игнорируются. Считывание символов заканчивается на символе не являющемся записью числа. Указатель на этот символ доступен через параметр endPtr , если он не равен NULL . В параметре radix можно указать систему счисления (число от 2 до 36 ). Если в параметре radix задано число 0 , то система счисления определяется автоматически. Пример преобразования:
Если в строке нет числа, то возвращается число 0 . Если число выходит за диапазон значений для типа, то значение будет соответствовать минимальному ( INTMAX_MIN или 0 ) или максимальному ( INTMAX_MAX или UINTMAX_MAX ) значению для типа, а переменной errno присваивается значение ERANGE . Пример:
- atof() — преобразует C-строку в число, имеющее тип double . Функция _atof_l() позволяет дополнительно задать локаль (от локали зависит десятичный разделитель вещественных чисел). Прототипы функций:
- strtod() — преобразует C-строку в вещественное число, имеющее тип double . Функция _strtod_l() позволяет дополнительно задать локаль. Прототипы функций:
Пробельные символы в начале строки игнорируются. Считывание символов заканчивается на символе не являющемся записью вещественного числа. Указатель на этот символ доступен через параметр endPtr , если он не равен NULL . Пример преобразования:
Обратите внимание: от настроек локали зависит десятичный разделитель вещественных чисел:
Если в строке нет числа, то возвращается число 0 . Если число выходит за диапазон значений для типа, то возвращается значение -HUGE_VAL или HUGE_VAL , а переменной errno присваивается значение ERANGE ;
- strtof() — преобразует C-строку в вещественное число, имеющее тип float . Прототип функции:
Пробельные символы в начале строки игнорируются. Считывание символов заканчивается на символе не являющемся записью вещественного числа. Указатель на этот символ доступен через параметр endPtr , если он не равен NULL . Пример преобразования (обратите внимание: от настроек локали зависит десятичный разделитель вещественных чисел):
Если в строке нет числа, то возвращается число 0 . Если число выходит за диапазон значений для типа, то возвращается значение –HUGE_VALF или HUGE_VALF , а переменной errno присваивается значение ERANGE ;
- strtold() — преобразует C-строку в вещественное число, имеющее тип long double . Прототип функции:
Пробельные символы в начале строки игнорируются. Считывание символов заканчивается на символе не являющемся записью вещественного числа. Указатель на этот символ доступен через параметр endPtr , если он не равен NULL . Пример преобразования:
Если в строке нет числа, то возвращается число 0 . Если число выходит за диапазон значений для типа, то возвращается значение –HUGE_VALL или HUGE_VALL , а переменной errno присваивается значение ERANGE .
Все рассмотренные в этом разделе функции позволяют преобразовать всю C-строку в число. Если необходимо преобразовать отдельный символ (представляющий число) в соответствующее целое число от 0 до 9 , то можно воспользоваться следующим кодом:
В переменной типа char хранится код символа, а не сам символ. Символы от ‘0’ до ‘9’ в кодировке ASCII имеют коды от 48 до 57 соответственно. Следовательно, чтобы получить целое число от 0 до 9 достаточно вычесть из текущего символа код символа ‘0’ . В качестве еще одного примера сохраним все цифры, встречающиеся в C-строке, в целочисленном массиве (листинг 5.2).
Листинг 5.2. Преобразование символов C-строки в отдельные цифры
Для преобразования строки в число можно также воспользоваться функциями sscanf() и _snscanf() . Прототипы функций:
В параметре str указывается C-строка, содержащая число, в параметре maxCount — максимальное количество просматриваемых символов в строке, а в параметре format — строка специального формата, внутри которой задаются спецификаторы, аналогичные применяемым в функции printf() (см. разд. 2.9), а также некоторые дополнительные спецификаторы. В последующих параметрах передаются адреса переменных. Функции возвращают количество произведенных присваиваний. Пример получения двух целых чисел:
Функция sscanf() не производит никакой проверки длины строки, что может привести к ошибке. Обязательно указывайте ширину при использовании спецификатора %s (например, %255s ). Кроме того, следует учитывать, что функция не проверяет возможность выхода значения за диапазон значений для типа, что может привести к неправильному результату. Функция никак об этом вас не предупредит, поэтому лучше использовать функции, рассмотренные в начале этого раздела.

Учебник C++ (Qt Creator и MinGW) в формате PDF
Помощь сайту
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов