Обычно строку, при разработке приложения, преобразуют в числа, такие как целое и двойное число.
В этой статье мы рассмотрим функции, которые можно использовать для эффективного преобразования строк в int & double и числовых значений в строку.
Функции преобразования строк
При программировании приложения на C++, возникает необходимость конвертировать данные из одного типа в другой. Преобразование данных должно быть таким, чтобы никакие данные не терялись при преобразовании существующих данных в новый тип. Это особенно нужно, когда мы конвертируем строковые данные в числа и наоборот.
В данной статье мы обсудим различные функции для преобразования объекта std::string в числовые типы данных, включая integer и double.
Преобразование строки в числовые типы
Как правило, в C++ существует два распространенных метода преобразования строк в числа:
- Использование функций stoi и atoi, которые реплицируются для всех числовых типов данных.
- Использование класса stringstream.
Остановимся подробно на каждом способе.
Использование функций stoi и atoi
Класс std::string поддерживает различные функции для преобразования строки в integer, long, double, float и т. д. Функции преобразования, поддерживаемые std::string, сведены в таблицу следующим образом:
Функция | Описание |
stoi stol stoll |
Преобразует строку в целое число (включая типы long и long long). |
atoi atol atoll |
Преобразует строку байтов в целое число (включая тип long и long long). |
stod stof stold |
Преобразует строку байтов в значения с плавающей запятой (включая типы float, double и long double). |
stoul stoull |
Преобразует строку байтов в целое число без знака (включая типы unsigned long и unsigned long long). |
Теперь мы обсудим функции преобразования для преобразования строки в int и строки в double.
Преобразование строки в int и использование stoi() и atoi()
stoi()
Прототип функции: stoi(const std::string& str, std::size_t* pos = 0, int base = 10);
Параметры:
str=> Строка для преобразования
pos=> Адрес целого числа для хранения количества обработанных символов; по умолчанию = 0
base=> Основание счисления; default=0
Возвращаемое значение: Целое число, эквивалентное указанной строке.
Исключения: std::invalid_argument=>Если невозможно выполнить преобразование.
Std::out_of_range=>Если преобразованное значение выходит за пределы диапазона типа результата.
Описание: Функция stoi() принимает в качестве аргумента строку и возвращает целочисленное значение. Она выдаст исключение, если преобразованное значение выходит за пределы допустимого диапазона или если преобразование невозможно выполнить.
Давайте пример программирования для лучшего понимания работы функции:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> #include <string> using namespace std; int main() { string mystr1 = "53"; string mystr2 = "3.142"; string mystr3 = "31477 with char"; int strint1 = stoi(mystr1); int strint2 = stoi(mystr2); int strint3 = stoi(mystr3); cout << "stoi(\"" << mystr1 << "\") is " << strint1 << '\n'; cout << "stoi(\"" << mystr2 << "\") is " << strint2 << '\n'; cout << "stoi(\"" << mystr3 << "\") is " << strint3 << '\n'; } |
Вывод данных:
stoi(“53”) is 53 stoi(“3.142”) is 3 stoi(“31477 with char”) is 31477 |
В приведенной выше программе мы использовали функцию stoi с тремя разными строками. Обратите внимание, что при преобразовании строковых данных в целочисленное значение функция отбрасывает пробелы или любые другие символы.
Следовательно, в случае mystr2 (3.142) функция отбрасывала все после запятой. Аналогично, в случае с mystr3 («31477 с char») учитывалось только число. Остальное содержимое строки было отброшено.
atoi()
Прототип функции: int atoi(const char *str);
Параметры: str=> Указатель на строку байтов, оканчивающуюся нулем.
Возвращаемое значение:
Success=> целочисленное значение, соответствующее аргументу str.
Ошибка => Не определено, если преобразованное значение выходит за пределы допустимого диапазона.
0=> Если преобразование невозможно.
Описание: Эта функция преобразует строку байтов в целочисленное значение. Функция atoi() отбрасывает любые пробелы до тех пор, пока не встретится символ, не являющийся пробелом, а затем берет символы один за другим для формирования допустимого представления целого числа и преобразует его в целое число.
Пример работы функции atoi:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
#include <iostream> #include <cstdlib> using namespace std; int main() { const char *mystr1 = "24"; const char *mystr2 = "3.142"; const char *mystr3 = "23446 with char"; const char *mystr4 = "words with 3"; int mynum1 = atoi(mystr1); int mynum2 = atoi(mystr2); int mynum3 = atoi(mystr3); int mynum4 = atoi(mystr4); cout << "atoi(\"" << mystr1 << "\") is " << mynum1 << '\n'; cout << "atoi(\"" << mystr2 << "\") is " << mynum2 << '\n'; cout << "atoi(\"" << mystr3 << "\") is " << mynum3 << '\n'; cout << "atoi(\"" << mystr4 << "\") is " << mynum4 << '\n'; } |
Вывод данных:
atoi(“24”) is 24 atoi(“3.142”) is 3 atoi(“23446 with char”) is 23446 atoi(“words with 3”) is 0 |
Как показано в приведенной выше программе, функция atoi принимает в качестве аргумента строку байтов и преобразует ее в целочисленное значение. Пробелы или любые другие символы отбрасываются. Если преобразованное значение выходит за пределы допустимого диапазона, возвращается 0.
Строка для удвоения stod()
Прототип функции: stod(const std::string& str, std::size_t* pos = 0);
Параметры:
str=> Строка для преобразования
pos=> Адрес целого числа для хранения количества обработанных символов; по умолчанию = 0
Возвращаемое значение: двойное значение, эквивалентное указанной строке.
Исключения:
std::invalid_argument=>Если невозможно выполнить преобразование.
std::out_of_range=>Если преобразованное значение выходит за пределы диапазона типа результата.
Описание: Эта функция преобразует строку в значение с плавающей запятой. Функция stod() отбрасывает любые пробелы до тех пор, пока не встретится символ, не являющийся пробелом, а затем берет символы один за другим, чтобы сформировать допустимое представление числа с плавающей запятой, и преобразует его в число с плавающей запятой.
Вот пример, демонстрирующий эту функцию:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
#include <iostream> #include <cstdlib> using namespace std; int main() { const char *mystr1 = "24"; const char *mystr2 = "3.142"; const char *mystr3 = "23446 with char"; double mynum1 = stod(mystr1); double mynum2 = stod(mystr2); double mynum3 = stod(mystr3); cout << "stod(\"" << mystr1 << "\") is " << mynum1 << '\n'; cout << "stod(\"" << mystr2 << "\") is " << mynum2 << '\n'; cout << "stod(\"" << mystr3 << "\") is " << mynum3 << '\n'; } |
Вывод данных:
stod(“24”) is 24 stod(“3.142”) is 3.142 stod(“23446 with char”) is 23446 |
Вышеприведенная программа демонстрирует использование функции «stod». Выходные данные показывают преобразованные двойные значения указанных строк.
Использование класса stringstream
Использование класса stringstream — это самый простой способ преобразовать строковые значения в числовые значения.
Ниже приведена программа, которая демонстрирует преобразование строки в числовое значение:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#include <iostream> #include <sstream> using namespace std; int main() { string str = "2508"; stringstream sstream(str); int num = 0; sstream >> num; double dNum=0.0; string doublestr = "3.142"; stringstream dstream(doublestr); dstream >>dNum; cout << "Value of num : " << num<<endl; cout << "Value of dNum : " << dNum; return 0; } |
Вывод данных:
Value of num : 2508 Value of dNum : 3.142 |
В приведенной выше программе видно, что мы объявили строковый объект. Затем мы объявляем объект stringstream и передаем строку этому объекту, чтобы строка была преобразована в объект stringstream. Затем этот объект stringstream передается в целочисленное значение с помощью оператора ‘>>’, который преобразует объект stringstream в целое число.
Точно так же мы преобразовали строку в двойную. Итак, пока оператор «>>» поддерживает тип данных, мы можем преобразовать строку в любой тип данных, используя объект stringstream.
Преобразование int в строку
Мы также можем преобразовать числовые значения в строковые значения. Существует два метода преобразования числовых значений в строковые, мы обсудим их ниже.
Использование функции to_string()
Прототип функции: std::string to_string(type value);
Параметры: value=> Числовое значение для преобразования
Возвращаемое значение: Строковое значение, содержащее преобразованное значение.
Исключение: может выдать std::bad_alloc
Описание: Эта функция to_string() преобразует числовое значение, переданное в качестве аргумента, в строковый тип и возвращает строку.
Давайте посмотрим на пример этой функции:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#include<iostream> #include<string> // used for string and to_string() using namespace std; int main() { int int_val = 20; float flt_val = 30.50; string str_int = to_string(int_val); string str_float = to_string(flt_val); cout << "The string representation of integer : "; cout << str_int << endl; cout << "The string representation of float : "; cout << str_float << endl; return 0; } |
Вывод данных:
The string representation of integer : 20 The string representation of float : 30.500000 |
Здесь у нас есть две переменные, каждая из которых имеет тип integer и float. Затем мы дважды вызываем метод to_string с целочисленным аргументом и аргументом с плавающей запятой и конвертируем оба значения в строковые значения. Наконец, мы отображаем преобразованные значения.
Обратите внимание, что преобразование значения с плавающей запятой в строку может привести к неожиданным результатам, поскольку количество значащих цифр может быть равно нулю из-за метода to_string.
Использование класса stringstream
Использование класса stringstream начинается с объявления объекта потока, который вставляет числовое значение в виде потока в объект. Затем он использует функцию «str()» для внутреннего преобразования числового значения в строку.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
#include<iostream> #include <sstream> #include <string> using namespace std; int main() { int num = 26082019; double num_d = 3.142; ostringstream mystr; ostringstream my_dstr; mystr << num; string resultstr = mystr.str(); my_dstr << num_d; string d_str = my_dstr.str(); cout << "The string formed from integer is : "; cout << resultstr << endl; cout << "The string formed from double is : "; cout << d_str << endl; return 0; } #include<iostream> #include <sstream> #include <string> using namespace std; int main() { int num = 26082019; double num_d = 3.142; ostringstream mystr; ostringstream my_dstr; mystr << num; string resultstr = mystr.str(); my_dstr << num_d; string d_str = my_dstr.str(); cout << "The string formed from integer is : "; cout << resultstr << endl; cout << "The string formed from double is : "; cout << d_str << endl; return 0; } |
Вывод данных:
The string formed from integer is: 26082019 The string formed from double is: 3.142 |
В этом листинге мы определили целое число и двойное значение. Затем у нас есть объект ostringstream, с помощью которого мы преобразуем числовое значение в объект stringstream. Для этого используется оператор ‘<<‘. Затем мы используем метод str() для объекта stringstream, чтобы преобразовать его в строку.
Итог
В этой статье мы обсудили функции преобразования, которые преобразуют строку в числовые типы и числовые типы обратно в строку. Мы подробно рассмотрели функции и примеры функций stoi(), stod(), atoi(), to_string(). Мы также обсудили некоторые функции и методы класса stringstream, которые помогают нам выполнять упомянутые преобразования.
В следующей статье мы рассмотрим функции преобразования символов в C++, такие как преобразование символа в целое число или строки и массива символов в строку, с примерами кода.
С Уважением, МониторБанк