<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Как перевести string в int в C: подробное руководство с примерами]]></title><description><![CDATA[<p dir="auto">Преобразование строки в целое число в языке C - это базовая задача, с которой сталкивается каждый разработчик. Часто данные приходят в виде строк из файлов, ввода пользователя или сетевых запросов, и их нужно быстро конвертировать в int для вычислений. Это помогает избежать ошибок и упрощает работу с числами.</p>
<p dir="auto">В этой статье разберем основные способы перевода string в int в C. Вы узнаете про стандартные функции, их особенности и подводные камни. Пройдем от простых примеров до продвинутых случаев с обработкой ошибок - все четко и по делу, чтобы вы могли сразу применить знания в своем коде.</p>
<h2>Основные функции для конвертации</h2>
<p dir="auto">В C для перевода строки в число используют функции из стандартной библиотеки &lt;stdlib.h&gt;. Самая популярная - <strong>atoi</strong>, она простая и быстрая, но имеет ограничения. Например, atoi принимает const char* и возвращает int, игнорируя лишние символы после цифр.</p>
<p dir="auto">Возьмем строку “1234”. Функция atoi(“1234”) вернет 1234 без проблем. А если строка " +1234abc", то atoi проигнорирует пробелы, знак и буквы, выдав все то же 1234. Это удобно, но опасно: нет проверки на ошибки, и при переполнении возвращается неопределенное значение. Более надежные варианты - strtol и strtoul, они позволяют указать базис системы счисления и получить указатель на конец преобразованной части.</p>
<p dir="auto">Вот ключевые функции в сравнении:</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Функция</th>
<th>Тип результата</th>
<th>Особенности</th>
</tr>
</thead>
<tbody>
<tr>
<td>atoi</td>
<td>int</td>
<td>Простая, без проверки ошибок</td>
</tr>
<tr>
<td>strtol</td>
<td>long</td>
<td>Поддержка базы, endptr для ошибок</td>
</tr>
<tr>
<td>strtoul</td>
<td>unsigned long</td>
<td>Для беззнаковых чисел</td>
</tr>
</tbody>
</table>
<ul>
<li><strong>atoi</strong>: Идеальна для простых случаев, где строка гарантированно содержит число.</li>
<li><strong>strtol</strong>: Лучше для production-кода - проверяет переполнение и возвращает LONG_MAX/LONG_MIN.<br />
<em>Важно: всегда включайте &lt;stdlib.h&gt; и &lt;string.h&gt; для работы с этими функциями.</em></li>
</ul>
<h2>Примеры использования atoi и strtol</h2>
<p dir="auto">Функция atoi - это классика для быстрого прототипирования. Она пропускает ведущие пробелы, учитывает знак + или -, а все после первой нецифры игнорирует. Представьте, вы читаете число из консоли: char str[] = “123”; int num = atoi(str); - и готово.</p>
<p dir="auto">Но atoi не сообщает об ошибках. Если строка “abc”, вернется 0, и вы не поймете, было ли это нулем или ошибкой. strtol умнее: она заполняет endptr указателем на первый нечисловой символ. Если *endptr != ‘\0’, значит, строка не полностью число. Плюс, проверка на переполнение через errno.</p>
<p dir="auto">Простой пример кода с strtol:</p>
<pre><code class="language-c">#include &lt;stdio.h&gt;
#include &lt;stdlib.h&gt;
#include &lt;errno.h&gt;

int main() {
    char *str = "123abc";
    char *endptr;
    long num = strtol(str, &amp;endptr, 10);
    if (endptr == str || *endptr != '\0') {
        printf("Ошибка преобразования!\n");
    } else {
        printf("Число: %ld\n", num);
    }
    return 0;
}
</code></pre>
<ul>
<li>Вариант 1: atoi для скоростных скриптов - минимум кода, максимум простоты.</li>
<li>Вариант 2: strtol с endptr - надежность для реальных приложений.</li>
<li>Вариант 3: Проверка errno после strtol на ERANGE для переполнения.<br />
<em>Нюанс: strtol интерпретирует ‘0x’ как hex, ‘0’ как octal - укажите base=10 явно.</em></li>
</ul>
<h2>Обработка ошибок и переполнения</h2>
<p dir="auto">Переполнение - частая проблема при работе с большими строками. atoi просто вернет мусор, а strtol установит errno в ERANGE и вернет LONG_MAX или LONG_MIN. Это критично для финансовых приложений или парсинга данных.</p>
<p dir="auto">Рассмотрим таблицу поведения функций при ошибках. Например, strtol(“999999999999”) на 32-битной системе даст LONG_MAX. Всегда проверяйте endptr и errno после вызова. Еще один случай: пустая строка или только пробелы - atoi вернет 0, но это может быть ошибкой.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Условие</th>
<th>atoi</th>
<th>strtol</th>
</tr>
</thead>
<tbody>
<tr>
<td>Переполнение +</td>
<td>мусор</td>
<td>LONG_MAX</td>
</tr>
<tr>
<td>Переполнение -</td>
<td>мусор</td>
<td>LONG_MIN</td>
</tr>
<tr>
<td>Нет цифр</td>
<td>0</td>
<td>0, endptr=str</td>
</tr>
<tr>
<td>Лишние символы</td>
<td>игнор</td>
<td>endptr указ.</td>
</tr>
</tbody>
</table>
<ul>
<li><em>Шаг 1</em>: Вызовите strtol с &amp;endptr.</li>
<li><em>Шаг 2</em>: if (errno == ERANGE) - обработайте переполнение.</li>
<li><em>Шаг 3</em>: if (*endptr != ‘\0’) - строка некорректна.</li>
</ul>
<p dir="auto">Такая схема спасет от крашей в продакшене.</p>
<h2>Ручная реализация преобразования</h2>
<p dir="auto">Иногда стандартные функции недоступны или нужно кастомное поведение. Тогда пишем свою функцию: проходим по строке посимвольно, умножаем результат на 10 и добавляем цифру минус ‘0’. Это учит понимать, как atoi работает под капотом.</p>
<p dir="auto">Алгоритм прост: пропустить пробелы и знак, затем for-цикл по цифрам. Обработайте переполнение через проверку на INT_MAX/INT_MIN. Такой подход полезен для embedded-систем без stdlib.</p>
<p dir="auto">Пример ручной функции:</p>
<pre><code class="language-c">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] &gt;= '0' &amp;&amp; str[i] &lt;= '9') {
        result = result * 10 + (str[i++] - '0');
    }
    return sign * result;
}
</code></pre>
<ul>
<li>Плюс: Полный контроль над логикой.</li>
<li>Минус: Нужно вручную обрабатывать все edge-кейсы.<br />
<em>Совет: Тестируйте на строках вроде “-2147483648” - граница int.</em></li>
</ul>
<h2>Когда стоит выбрать каждую функцию</h2>
<p dir="auto">Выбор зависит от контекста: atoi для хаков, strtol для надежности, ручная для минимализма. В больших проектах комбинируйте с проверками. Например, в парсере конфига - strtol с логами ошибок. Для CLI-утилит atoi хватит.</p>
<p dir="auto">Не забывайте о локали: в некоторых системах запятая вместо точки, но для int это реже. Всегда компилируйте с -std=c99 или выше для полной поддержки.</p>
<h2>Практические кейсы в реальном коде</h2>
<p dir="auto">В реальных задачах строка часто грязная: пробелы, знаки, hex. atoi справится с базовым, но для hex используйте strtol(str, NULL, 0) - база 0 автоопределяет. В GUI или веб - проверяйте валидность перед конвертацией.</p>
<p dir="auto">Представьте парсер логов: “user:123 errors”. strtol остановится на пробеле. Или CLI: scanf(“%s”, buf); int val = atoi(buf); - стандартный паттерн.</p>
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>Кейс</th>
<th>Рекомендация</th>
<th>Пример строки</th>
</tr>
</thead>
<tbody>
<tr>
<td>CLI ввод</td>
<td>atoi</td>
<td>“42”</td>
</tr>
<tr>
<td>Файл конфиг</td>
<td>strtol + check</td>
<td>" +100abc"</td>
</tr>
<tr>
<td>Hex значения</td>
<td>strtol(base=0)</td>
<td>“0xFF”</td>
</tr>
</tbody>
</table>
<p dir="auto">Такой подход покрывает 99% сценариев без лишнего кода.</p>
]]></description><link>https://forum.exlends.ru/topic/900/kak-perevesti-string-v-int-v-c-podrobnoe-rukovodstvo-s-primerami</link><generator>RSS for Node</generator><lastBuildDate>Wed, 20 May 2026 18:59:04 GMT</lastBuildDate><atom:link href="https://forum.exlends.ru/topic/900.rss" rel="self" type="application/rss+xml"/><pubDate>Mon, 02 Mar 2026 08:08:12 GMT</pubDate><ttl>60</ttl></channel></rss>