Функция atoi в C++: из строки в число с примерами

Привет! Сегодня мы рассмотрим полезную функцию, которая позволяет преобразовать строку в число. Например, у вас есть строка "1234" и вам нужно получить число 1234. C/C++ функция atoi отлично справиться с этой задачей. В этом уроке мы начнем с примера, а после попробуем реализовать эту функцию сами.

atoi - это сокращение от ”Ascii TO Int”.

Иллюстрация atoi

Как сконвертировать строку в число

Чтобы сконвертировать строку в число можно воспользоваться функцией 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;
123
-123
456
0

Как реализовать 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++. Теперь осталось только набить руку на простых задачах.

Упражнения

  1. Обработка ошибок:
    Добавьте в вашу реализацию функции my_atoi проверку на переполнение. Если число в строке больше, чем INT_MAX или меньше, чем INT_MIN, ваша функция должна возвращать соответственно INT_MAX или INT_MIN.

  2. Реализация для long long:
    Создайте версию my_atoi для long long. Назовите ее my_atoll. Проверьте ее работу, используя различные числа, включая те, которые выходят за пределы long long.

  3. Сравнение atoi и my_atoi:
    Напишите программу, которая демонстрирует различия (или их отсутствие) между atoi и вашей реализацией my_atoi. В вашей программе должны быть использованы обе функции, и результаты их работы должны выводиться на экран.

Обсуждение