Как перевести string в int в C: подробное руководство с примерами
-
Преобразование строки в целое число в языке C - это базовая задача, с которой сталкивается каждый разработчик. Часто данные приходят в виде строк из файлов, ввода пользователя или сетевых запросов, и их нужно быстро конвертировать в int для вычислений. Это помогает избежать ошибок и упрощает работу с числами.
В этой статье разберем основные способы перевода string в int в C. Вы узнаете про стандартные функции, их особенности и подводные камни. Пройдем от простых примеров до продвинутых случаев с обработкой ошибок - все четко и по делу, чтобы вы могли сразу применить знания в своем коде.
Основные функции для конвертации
В C для перевода строки в число используют функции из стандартной библиотеки <stdlib.h>. Самая популярная - atoi, она простая и быстрая, но имеет ограничения. Например, atoi принимает const char* и возвращает int, игнорируя лишние символы после цифр.
Возьмем строку “1234”. Функция atoi(“1234”) вернет 1234 без проблем. А если строка " +1234abc", то atoi проигнорирует пробелы, знак и буквы, выдав все то же 1234. Это удобно, но опасно: нет проверки на ошибки, и при переполнении возвращается неопределенное значение. Более надежные варианты - strtol и strtoul, они позволяют указать базис системы счисления и получить указатель на конец преобразованной части.
Вот ключевые функции в сравнении:
Функция Тип результата Особенности atoi int Простая, без проверки ошибок strtol long Поддержка базы, endptr для ошибок strtoul unsigned long Для беззнаковых чисел - atoi: Идеальна для простых случаев, где строка гарантированно содержит число.
- strtol: Лучше для production-кода - проверяет переполнение и возвращает LONG_MAX/LONG_MIN.
Важно: всегда включайте <stdlib.h> и <string.h> для работы с этими функциями.
Примеры использования atoi и strtol
Функция atoi - это классика для быстрого прототипирования. Она пропускает ведущие пробелы, учитывает знак + или -, а все после первой нецифры игнорирует. Представьте, вы читаете число из консоли: char str[] = “123”; int num = atoi(str); - и готово.
Но atoi не сообщает об ошибках. Если строка “abc”, вернется 0, и вы не поймете, было ли это нулем или ошибкой. strtol умнее: она заполняет endptr указателем на первый нечисловой символ. Если *endptr != ‘\0’, значит, строка не полностью число. Плюс, проверка на переполнение через errno.
Простой пример кода с strtol:
#include <stdio.h> #include <stdlib.h> #include <errno.h> int main() { char *str = "123abc"; char *endptr; long num = strtol(str, &endptr, 10); if (endptr == str || *endptr != '\0') { printf("Ошибка преобразования!\n"); } else { printf("Число: %ld\n", num); } return 0; }- Вариант 1: atoi для скоростных скриптов - минимум кода, максимум простоты.
- Вариант 2: strtol с endptr - надежность для реальных приложений.
- Вариант 3: Проверка errno после strtol на ERANGE для переполнения.
Нюанс: strtol интерпретирует ‘0x’ как hex, ‘0’ как octal - укажите base=10 явно.
Обработка ошибок и переполнения
Переполнение - частая проблема при работе с большими строками. atoi просто вернет мусор, а strtol установит errno в ERANGE и вернет LONG_MAX или LONG_MIN. Это критично для финансовых приложений или парсинга данных.
Рассмотрим таблицу поведения функций при ошибках. Например, strtol(“999999999999”) на 32-битной системе даст LONG_MAX. Всегда проверяйте endptr и errno после вызова. Еще один случай: пустая строка или только пробелы - atoi вернет 0, но это может быть ошибкой.
Условие atoi strtol Переполнение + мусор LONG_MAX Переполнение - мусор LONG_MIN Нет цифр 0 0, endptr=str Лишние символы игнор endptr указ. - Шаг 1: Вызовите strtol с &endptr.
- Шаг 2: if (errno == ERANGE) - обработайте переполнение.
- Шаг 3: if (*endptr != ‘\0’) - строка некорректна.
Такая схема спасет от крашей в продакшене.
Ручная реализация преобразования
Иногда стандартные функции недоступны или нужно кастомное поведение. Тогда пишем свою функцию: проходим по строке посимвольно, умножаем результат на 10 и добавляем цифру минус ‘0’. Это учит понимать, как atoi работает под капотом.
Алгоритм прост: пропустить пробелы и знак, затем for-цикл по цифрам. Обработайте переполнение через проверку на INT_MAX/INT_MIN. Такой подход полезен для embedded-систем без stdlib.
Пример ручной функции:
int my_atoi(const char *str) { int sign = 1, result = 0, i = 0; while (str[i] == ' ') i++; if (str[i] == '-') { sign = -1; i++; } else if (str[i] == '+') i++; while (str[i] >= '0' && str[i] <= '9') { result = result * 10 + (str[i++] - '0'); } return sign * result; }- Плюс: Полный контроль над логикой.
- Минус: Нужно вручную обрабатывать все edge-кейсы.
Совет: Тестируйте на строках вроде “-2147483648” - граница int.
Когда стоит выбрать каждую функцию
Выбор зависит от контекста: atoi для хаков, strtol для надежности, ручная для минимализма. В больших проектах комбинируйте с проверками. Например, в парсере конфига - strtol с логами ошибок. Для CLI-утилит atoi хватит.
Не забывайте о локали: в некоторых системах запятая вместо точки, но для int это реже. Всегда компилируйте с -std=c99 или выше для полной поддержки.
Практические кейсы в реальном коде
В реальных задачах строка часто грязная: пробелы, знаки, hex. atoi справится с базовым, но для hex используйте strtol(str, NULL, 0) - база 0 автоопределяет. В GUI или веб - проверяйте валидность перед конвертацией.
Представьте парсер логов: “user:123 errors”. strtol остановится на пробеле. Или CLI: scanf(“%s”, buf); int val = atoi(buf); - стандартный паттерн.
Кейс Рекомендация Пример строки CLI ввод atoi “42” Файл конфиг strtol + check " +100abc" Hex значения strtol(base=0) “0xFF” Такой подход покрывает 99% сценариев без лишнего кода.
© 2024 - 2026 ExLends, Inc. Все права защищены.