Ваша логика не соответствует «спецификации».
см это
Недопустимое значение не обязательно устанавливает 'errno'.
(копия следует)
long int strtol (const char * str, char ** endptr, int base);
Преобразовать строку в длинное целое
Анализирует строку C str, интерпретируя ее содержимое как целое число указанной базы, которое возвращается как длинное значение типа int.
Функция сначала отбрасывает столько пробельных символов, сколько необходимо, пока не будет найден первый непробельный символ. Затем, начиная с этого символа, принимает максимально возможное количество символов, допустимых в соответствии с синтаксисом, который зависит от базового параметра, и интерпретирует их как числовое значение. Наконец, указатель на первый символ, следующий за целочисленным представлением в str, сохраняется в объекте, указанном endptr.
Если значение base равно нулю, ожидаемый синтаксис аналогичен синтаксису целочисленных констант, который образован последовательностью:
Дополнительный знак плюс или минус
Необязательный префикс, указывающий восьмеричное или шестнадцатеричное основание («0» или «0x» соответственно)
Последовательность десятичных цифр (если не указан базовый префикс) или восьмеричные или
шестнадцатеричные цифры, если присутствует определенный префикс
Если базовое значение находится в диапазоне от 2 до 36, ожидаемый формат для целого числа представляет собой последовательность действительных цифр и / или букв, необходимых для представления целых чисел указанного радиуса (начиная с '0' и до 'z '/' Z 'для оснований 36). Последовательности может предшествовать знак плюс или минус и, если основание равно 16, необязательный префикс «0x» или «0X».
Если первая последовательность непробельных символов в str не является действительным целым числом, как определено выше, или если такой последовательности не существует, потому что либо str пуст или содержит только пробельные символы, преобразование не выполняется.
Параметры
ул
C строка, содержащая представление целого числа.
endptr
Ссылка на объект типа char *, значение которого устанавливается функцией на следующий символ в строке после числового значения.
Этот параметр также может быть нулевым указателем, в этом случае он не используется.
Возвращаемое значение
В случае успеха функция возвращает преобразованное целое число как длинное значение типа int.
Если действительное преобразование не может быть выполнено, возвращается нулевое значение.
Если правильное значение находится вне диапазона представимых значений, LONG_MAX или
Возвращается LONG_MIN, а глобальной переменной errno задано значение ERANGE.