Правильная функция (если вы настаиваете на использовании функций в стиле C) - strtol
, и код преобразования может выглядеть следующим образом
const char *number = "10"; /* for example */
char *end;
long value = strtol(number, &end, 10);
if (end == number || *end != '\0' || errno == ERANGE)
/* ERROR, abort */;
/* Success */
/* Add whatever range checks you want to have on the value of `value` */
Некоторые замечания:
strtol
разрешает (то есть тихо пропускает) пробел перед фактическим числом. Если вы считаете, что такие начальные пробелы являются ошибкой, вы должны проверить это самостоятельно.
Проверка на *end != '\0'
удостоверяет, что после цифр ничего нет. Если вы хотите разрешить другие символы после фактического числа (пробел?), Эту проверку необходимо соответствующим образом изменить.
P.S. Позже я добавил проверку end == number
, чтобы перехватить пустые входные последовательности. Входы "Все пробелы" и "вообще без номера" были бы обнаружены только проверкой *end != '\0'
. Может быть, имеет смысл заранее ловить пустой ввод. В этом случае end == number
проверка станет / может стать ненужной.