Функция atoi в C++: из строки в число с примерами
Привет! Сегодня мы рассмотрим полезную функцию, которая позволяет преобразовать строку в число. Например, у вас есть строка "1234"
и вам нужно получить число 1234
. C/C++ функция atoi
отлично справиться с этой задачей. В этом уроке мы начнем с примера, а после попробуем реализовать эту функцию сами.
atoi
- это сокращение от ”Ascii TO Int”.
Как сконвертировать строку в число
Чтобы сконвертировать строку в число можно воспользоваться функцией atoi
. Прототип этой функции:
int atoi (const char * str);
- Единственным аргументом функция принимает указатель на строку, которую нужно преобразовать в число.
- Возвращает функция число, которое было в строке. При этом строка не обязана состоять только из цифр:
- все пробельные символы в начале строке будут проигнорированы;
- далее будет учтен знак
+
или-
если таковой присутствует; - далее все цифры будут интерпретированы как числовое значение;
- все символы после первого не цифрового будут проигнорированы;
- если цифр после пробельных символов не было, то функция вернет
0
.
Ух, много правил, но их легко понять на примере:
#include <iostream>
using namespace std;
int main() {
char buffer[33];
cout << "atoi(\"1234\") = " << atoi("1234") << endl;
cout << "atoi(\"1234текст\") = " << atoi("1234текст") << endl;
cout << "atoi(\" \\n \\r 1234\") = " << atoi(" \n \r 1234") << endl;
cout << "atoi(\"+1234\") = " << atoi("+1234") << endl;
cout << "atoi(\"-1234\") = " << atoi("-1234") << endl;
cout << "atoi(\"числа нет\") = " << atoi("числа нет") << endl;
cout << "atoi(\" +1234 все вместе\") = " << atoi(" +1234 все вместе") << endl;
return 0;
}
Вывод программы:
atoi("1234") = 1234
atoi("1234текст") = 1234
atoi(" \n \r 1234") = 1234
atoi("+1234") = 1234
atoi("-1234") = -1234
atoi("числа нет") = 0
atoi(" +1234 все вместе") = 1234
Как видите, atoi
просто вернет первое число, которое встретит после пробельных символов.
Что будет выведено на экран:
cout << atoi(" -123 абв 456") << endl;
Как реализовать atoi самому
Теперь давайте попробуем реализовать atoi
сами. Это поможет нам лучше понять то, как эта функция работает:
#include <iostream>
using namespace std;
int my_atoi(char* str) {
// пропускаем пробельные символы
while (*str == '\n' || *str == ' ' || *str == '\r') str++;
// нам нужно запомнить знак числа
bool negative = false;
if (*str == '-') {
negative = true;
str++;
} else if (*str == '+') {
str++;
}
// в этой переменной мы будем хранить результат
int result = 0;
// бежим по строке до тех пор, пока нам встречаются цифры
while (*str >= '0' && *str <= '9') {
result = (result * 10) + (*str - '0');
str++;
}
// умножаем на -1 если был знак минус
if (negative) {
result *= -1;
}
return result;
}
int main() {
char buffer[33];
cout << "my_atoi(\"1234\") = " << my_atoi("1234") << endl;
cout << "my_atoi(\"1234текст\") = " << my_atoi("1234текст") << endl;
cout << "my_atoi(\" \\n \\r 1234\") = " << my_atoi(" \n \r 1234") << endl;
cout << "my_atoi(\"+1234\") = " << my_atoi("+1234") << endl;
cout << "my_atoi(\"-1234\") = " << my_atoi("-1234") << endl;
cout << "my_atoi(\"числа нет\") = " << my_atoi("числа нет") << endl;
cout << "my_atoi(\" +1234 все вместе\") = " << my_atoi(" +1234 все вместе") << endl;
return 0;
}
И вывод:
my_atoi("1234") = 1234
my_atoi("1234текст") = 1234
my_atoi(" \n \r 1234") = 1234
my_atoi("+1234") = 1234
my_atoi("-1234") = -1234
my_atoi("числа нет") = 0
my_atoi(" +1234 все вместе") = 1234
Поздравляю! Вы реализовали аналог функции atoi
из стандартной библиотеки C++. Теперь осталось только набить руку на простых задачах.
Упражнения
-
Обработка ошибок:
Добавьте в вашу реализацию функцииmy_atoi
проверку на переполнение. Если число в строке больше, чемINT_MAX
или меньше, чемINT_MIN
, ваша функция должна возвращать соответственноINT_MAX
илиINT_MIN
. -
Реализация для
long long
:
Создайте версиюmy_atoi
дляlong long
. Назовите ееmy_atoll
. Проверьте ее работу, используя различные числа, включая те, которые выходят за пределыlong long
. -
Сравнение
atoi
иmy_atoi
:
Напишите программу, которая демонстрирует различия (или их отсутствие) междуatoi
и вашей реализациейmy_atoi
. В вашей программе должны быть использованы обе функции, и результаты их работы должны выводиться на экран.
Если хотите всегда быть в курсе последних новостей в мире программирования и IT, подписываетесь на мой Telegram-канал, где я делюсь свежими статьями, новостями и полезными советами. Буду рад видеть вас среди подписчиков!
Обсуждение