Несмотря на успешное преобразование строки, проверка errno
возвращает значение, указывающее на ошибку:
#include <stdlib.h>
#include <sys/errno.h>
const char* numberString = "7";
char* endPtr;
errno = 0;
long number = strtol(numberString, &endPtr, 10);
NSLog(@"%ld", number);
if (errno) {
perror("string to integer conversion failed");
}
Выход есть (на Симуляторе, iOS 7)
$ 2014-05-22 09:27:32.954 Test[2144:60b] 7
$ string to integer conversion failed: No such process
На устройстве поведение аналогичное.
справочная страница для strtol
говорит в комментарии:
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
Функции strtol(), strtoll(), strtoimax() и strtoq() возвращают результат преобразования, если только значение не будет переполнено или потеряно. Если преобразование не может быть выполнено, возвращается 0, а глобальная переменная errno устанавливается в EINVAL (последняя функция не переносима на все платформы). Если происходит переполнение или потеря значимости, для errno устанавливается значение ERANGE, а возвращаемое значение функции фиксируется в соответствии со следующей таблицей.
Совершенно неясно, что именно это означает для iOS. Любые идеи здесь?
Редактировать:
Оказалось, что вызов функции NSLog
установил errno
. Итак, @Mat в своем ответе и комментариях был точен, говоря, что «все ставки сняты при тестировании errno
ПОСЛЕ вызова несвязанной функции (здесь NSLog
).
errno
устанавливается только в том случае, еслиstrtol
терпит неудачу - посколькуstrtol
завершается успешно, вам не следует пытаться прочитатьerrno
. - person Paul R   schedule 22.05.2014