
В языке Си преобразование текстового представления числа в его числовой формат выполняется с помощью стандартных функций из библиотеки <stdlib.h> и <stdio.h>. Чаще всего применяются atoi, atol, atof, а также более универсальные strtol, strtoll и strtod. Эти функции позволяют интерпретировать строку как целое или вещественное число, контролируя основание системы счисления и проверяя корректность входных данных.
Для обработки возможных ошибок предпочтительнее использовать strtol и родственные функции, так как они позволяют определить позицию первого некорректного символа через указатель на endptr. Это помогает отличить корректное преобразование от ситуации, когда строка не содержит ни одной цифры или содержит недопустимые символы. Значение переменной errno также может сигнализировать о переполнении или других проблемах.
При работе с вещественными числами используется strtod или strtof, которые корректно обрабатывают десятичную точку, экспоненциальную форму и специальные значения вроде NaN или INF. Важно учитывать локаль, так как символ разделителя дробной части может отличаться. Для надежной работы в разных средах целесообразно явно задавать или проверять текущую локаль с помощью setlocale.
При преобразовании строк, полученных от пользователя или из внешних источников, следует дополнительно проверять длину строки и допустимый диапазон результата, чтобы избежать переполнений и неопределенного поведения программы.
Использование функции atoi для целых чисел

Прототип: int atoi(const char *nptr); – объявление в <stdlib.h>. Функция пропускает начальные пробельные символы, обрабатывает опциональный знак +/- и последовательно считывает цифры в десятичной системе; чтение прекращается при первом нецифровом символе.
- Возвращаемое значение: целое (
int); если строка не содержит цифр в начале, возвращает0. - Отсутствие отчётности об ошибках:
atoiне сообщает о переполнении и не предоставляет указатель на конец анализа. - Переполнение: поведение при выходе за пределы типа
intзависит от реализации и не гарантировано; результат может быть непредсказуемым. - Типичные применения: быстрое преобразование контролируемых строк (встроенные данные, жестко заданные строки), где вход заранее ограничен по формату и по диапазону.
Рекомендации по использованию:
- Для парсинга необработанного пользовательского ввода или внешних данных используйте
strtol(с проверкойerrnoиendptr), а неatoi. - Если используете
atoi, заранее ограничьте длину и формат строки (регулярным выражением или ручной проверкой), чтобы минимизировать риск переполнения и неверной интерпретации. - Не полагайтесь на
0как индикатор ошибки – это может быть легитимное значение.
Пример поведения atoi:
#include <stdlib.h>
#include <stdio.h>
int main(void) {
const char s = " -1234abc";
int v = atoi(s);
printf("%d\n", v); / выведет: -1234 */
return 0;
}
Короткое сравнение с надёжным вариантом (strtol):
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
long parse(const char *s, int *ok) {
char *end;
errno = 0;
long val = strtol(s, &end, 10);
if (end == s || errno == ERANGE) { *ok = 0; return 0; }
*ok = 1;
return val;
}
Итог: atoi удобна для простых, строго контролируемых случаев. Для любых входных данных, требующих проверки корректности или устойчивости к переполнению, применяйте strtol с явной валидацией.
Чтение чисел из строки с контролем ошибок через strtol
Функция strtol позволяет преобразовать строку в целое число с возможностью точного контроля ошибок. Она принимает указатель на исходную строку, указатель на переменную типа char* для сохранения позиции первого непреобразованного символа и основание системы счисления. Возвращаемое значение имеет тип long int.
Для корректного определения ошибок следует проверять несколько условий. Во-первых, аргумент endptr должен указывать на символ, отличный от исходного указателя, иначе это означает отсутствие числовых данных. Во-вторых, при достижении диапазона типа long функция устанавливает errno в ERANGE, что сигнализирует о переполнении или выходе за нижнюю границу.
Перед вызовом strtol стоит обнулять errno и после выполнения проверять его значение. Если errno == ERANGE, необходимо обработать ошибку, например, вывести сообщение или завершить выполнение с кодом, обозначающим неверный ввод. При успешном чтении следует убедиться, что оставшаяся часть строки либо пуста, либо содержит только допустимые символы-разделители.
Пример безопасного использования:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
int main() {
const char *str = "123abc";
char *endptr;
errno = 0;
long value = strtol(str, &endptr, 10);
perlCopyEditif (str == endptr) {
printf("Нет чисел в строке\n");
return 1;
}
if (errno == ERANGE) {
printf("Число вне диапазона\n");
return 1;
}
printf("Прочитано: %ld\n", value);
return 0;
}
Такой подход обеспечивает корректное чтение чисел и надежную обработку некорректного ввода, что особенно важно при работе с внешними данными.
Проверка корректности ввода перед преобразованием

Перед вызовом функций преобразования необходимо проверить, что строка содержит допустимые символы и корректную структуру числа. Для целого значения допустим один знак «+» или «−» в начале и последовательность цифр. Для вещественных чисел допускается один разделитель дробной части и необязательная экспоненциальная часть с буквой «e» или «E».
Если используется strtol или strtod, важно анализировать параметр endptr. При корректном вводе он должен указывать на конец строки. Если после числа остались дополнительные символы, результат считается недействительным. Для контроля переполнения следует проверять errno и сравнивать полученное значение с LONG_MAX, LONG_MIN или HUGE_VAL.
Рекомендуется удалять начальные и конечные пробелы, отклонять пустые строки, а также ввод, не содержащий хотя бы одной цифры. Проверку символов можно выполнять через isdigit, strspn или strchr.
| Проверка | Действие |
|---|---|
| Пустая строка или пробелы | Прерывание обработки |
| Недопустимые символы | Фильтрация через isdigit и анализ допустимых знаков |
| Формат дробного числа | Контроль одного разделителя и корректности экспоненты |
| Положение endptr | Убедиться, что оно указывает на конец строки |
| Переполнение | Анализ errno и сравнение с предельными значениями |
Обработка переполнения и недопустимых символов
Для преобразования строк в числа в языке Си функции strtol, strtoll, strtof и подобные предоставляют встроенный механизм обработки ошибок. Переполнение фиксируется проверкой значения errno, установленного в ERANGE.
После вызова, если errno == ERANGE, это указывает, что результат вышел за пределы диапазона целевого типа. В таком случае рекомендуется не использовать возвращённое значение напрямую, а обрабатывать ошибку отдельно, например, ограничивая число максимумом или минимумом типа.
Для обнаружения недопустимых символов используется параметр endptr. Если указатель на первый символ, не участвующий в преобразовании, совпадает с указателем на начало строки, значит, число не распознано вообще. Если после числовой части остаются символы, не являющиеся пробелами или управляющими, ввод считается некорректным.
Важно проверить, что строка содержит только корректное число, не включая лишних символов, чтобы избежать неверного разбора. Следует игнорировать ведущие пробелы, но запрещать смешанный формат с буквами или символами внутри числа.
Для целочисленных преобразований допустимо проверять выход за границы типа, сравнивая возвращённое значение с LONG_MAX и LONG_MIN. В случае плавающей точки стоит дополнительно следить за значениями ±∞ и NaN, которые могут появиться при переполнении или ошибках парсинга.
Реализация должна предусматривать сброс errno перед вызовом преобразующей функции и проверку его значения после, чтобы избежать ложных срабатываний.
Преобразование строки в число в заданной системе счисления
В языке Си функция strtol позволяет преобразовать строку в целое число с указанием системы счисления. Вызов выглядит так: long int strtol(const char *nptr, char **endptr, int base);
Параметр base задаёт систему счисления от 2 до 36. При значении 0 система определяется автоматически: если строка начинается с «0x» или «0X» – используется шестнадцатеричная, если с «0» – восьмеричная, иначе десятичная.
Возможные значения base включают:
— 2 – двоичная
— 8 – восьмеричная
— 10 – десятичная
— 16 – шестнадцатеричная
и промежуточные (например, 3, 12, 36), где допустимы цифры и буквы до соответствующего предела.
Функция читает символы, пока они соответствуют цифрам выбранной системы. При обнаружении недопустимого символа чтение прекращается, а endptr указывает на этот символ.
Для обработки ошибок рекомендуется проверять:
— Совпадает ли endptr с началом строки, что означает отсутствие корректных цифр.
— Значение errno после вызова: при переполнении устанавливается ERANGE.
Для чисел с плавающей запятой аналогично существует функция strtod, но она не поддерживает указание системы счисления, только десятичную.
При использовании strtol с разными системами важно учитывать регистр букв: функция допускает как заглавные, так и строчные символы от ‘a’ до ‘z’, соответствующие цифрам от 10 до 35.
Сравнение стандартных функций преобразования по задачам

Для преобразования строк в числа в Си доступны несколько функций, каждая из которых имеет свои особенности и области применения.
atoi подходит для быстрого преобразования строки в int без обработки ошибок. Она не позволяет определить некорректный ввод или переполнение, что ограничивает её применение в ответственных программах.
strtol обеспечивает чтение целых чисел с контролем ошибок. Она позволяет указать систему счисления, возвращает указатель на первый непреобразованный символ и устанавливает errno при переполнении. Рекомендуется для точного и безопасного парсинга целочисленных значений.
strtod используется для преобразования строк в числа с плавающей запятой double. Также поддерживает контроль ошибок через указатель на остаток строки и errno, что позволяет отследить некорректный ввод и переполнение.
atof удобна для быстрого преобразования в double, но не информирует о некорректных данных и переполнении, поэтому подходит только для простых случаев.
При выборе функции важно учитывать требования к контролю ошибок и типу данных. Для надежного парсинга целых чисел strtol превосходит atoi. Для чисел с плавающей точкой strtod предпочтительнее atof за счет контроля ошибок. В случаях, когда входные данные подвержены ошибкам или необходимо работать с различными системами счисления, strtol и strtod – оптимальные решения.
Вопрос-ответ:
Какие стандартные функции языка Си подходят для преобразования строки в целое число и в чём их основные отличия?
В языке Си для преобразования строки в целое число часто используют функции atoi, strtol и sscanf. Функция atoi самая простая, но она не даёт возможности проверить корректность ввода и не обрабатывает ошибки. strtol более гибкая: она позволяет указать основание системы счисления и возвращает указатель на остаток строки, что помогает отследить, где остановилось чтение числа. Кроме того, strtol позволяет выявлять ошибки переполнения через переменную errno. Функция sscanf тоже позволяет читать числа из строк, но управление процессом разбора меньше, чем у strtol. Выбор функции зависит от того, насколько важна проверка ошибок и с какой системой счисления работают данные.
Как правильно обрабатывать ситуации, когда в строке есть недопустимые символы при преобразовании в число?
При чтении числа из строки может случиться так, что после цифр идут символы, не относящиеся к числу. Для точной обработки таких случаев лучше использовать функцию strtol, которая возвращает указатель на первый символ после числа. Если указатель совпадает с адресом начала строки, значит число не распознано. Если после числа есть символы, их можно считать ошибкой или проигнорировать, в зависимости от задачи. При использовании atoi таких возможностей нет — она просто преобразует начальную часть, игнорируя ошибки. Поэтому для надежной работы стоит проверять остаток строки и учитывать значение errno при вызове strtol.
Можно ли преобразовать строку в число с плавающей точкой стандартными средствами языка Си и как это сделать?
Да, в языке Си есть функция strtod, которая преобразует строку в число с плавающей точкой двойной точности. Она, как и strtol, возвращает указатель на первый символ после распознанного числа, что позволяет контролировать правильность преобразования и выявлять ошибки. Использование strtod предпочтительнее, если нужны числа с дробной частью или в экспоненциальной записи. Также существует функция atof, которая преобразует строку в double, но она не позволяет контролировать ошибки и не даёт информации о том, где остановился разбор. Поэтому strtod лучше подходит для задач, требующих точного контроля ввода.
Как избежать переполнения при преобразовании строки в число и какие методы проверки существуют?
Переполнение возникает, когда число, полученное из строки, превышает диапазон целевого типа данных. Чтобы его избежать, при использовании strtol нужно проверять переменную errno, которая устанавливается в ERANGE в случае переполнения. Кроме того, после вызова strtol следует сверить полученное значение с максимально и минимально допустимыми границами типа (например, LONG_MAX и LONG_MIN). Если используется atoi, переполнение обнаружить сложно, так как она не сообщает об ошибках. Для чисел с плавающей точкой strtod также устанавливает errno в случае переполнения или недополнения. Таким образом, правильная обработка ошибок требует проверки errno и анализа возвращаемых указателей.
