Рассмотрим следующую функцию:
#include <stdlib.h>
#include <errno.h>
/* SPDX-Identifier: CC0-1.0 */
const char *parse_ulong(const char *src, unsigned long *to)
{
const char *end;
unsigned long val;
if (!src) {
errno = EINVAL;
return NULL;
}
end = src;
errno = 0;
val = strtoul(src, (char **)(&end), 0);
if (errno)
return NULL;
if (end == src) {
errno = EINVAL;
return NULL;
}
if (to)
*to = val;
return end;
}
Эта функция анализирует длинную без знака в строке src
, возвращая указатель на первый неразобранный символ в src
, а длинная без знака сохраняется в *to
.Если есть ошибка, функция вернет NULL с errno, установленным для указания ошибки.
Если вы сравните функцию с man 3 strtoul
, вы увидите, что она обрабатывает все случаи ошибокправильно, и возвращает ненулевое значение, только когда src
возвращает действительный беззнаковый long.Особенно см. Раздел «Примечания».Также обратите внимание на то, как обрабатываются отрицательные числа.
Этот же шаблон работает для strtol()
, strtod()
, strtoull()
.