Существует простая функция C, называемая atoi, которая не так хороша, потому что обработка ошибок в лучшем случае не интуитивно понятна и ее легко забыть. Функция (C) strtol намного лучше, она делает привычку предпочитать эту функцию atoi. Вот пример кода со страницы руководства:
#include <stdlib.h>
#include <limits.h>
#include <stdio.h>
#include <errno.h>
int
main(int argc, char *argv[])
{
int base;
char *endptr, *str;
long val;
if (argc < 2) {
fprintf(stderr, "Usage: %s str [base]\n", argv[0]);
exit(EXIT_FAILURE);
}
str = argv[1];
base = (argc > 2) ? atoi(argv[2]) : 10;
errno = 0; /* To distinguish success/failure after call */
val = strtol(str, &endptr, base);
/* Check for various possible errors */
if ((errno == ERANGE && (val == LONG_MAX || val == LONG_MIN))
|| (errno != 0 && val == 0)) {
perror("strtol");
exit(EXIT_FAILURE);
}
if (endptr == str) {
fprintf(stderr, "No digits were found\n");
exit(EXIT_FAILURE);
}
/* If we got here, strtol() successfully parsed a number */
printf("strtol() returned %ld\n", val);
if (*endptr != '\0') /* Not necessarily an error... */
printf("Further characters after number: %s\n", endptr);
exit(EXIT_SUCCESS);
}
Обратите внимание на полное отсутствие каких-либо проверок ошибок для преобразования atoi(argv[2])
. Не то, чтобы strtol был слишком простым и интуитивно понятным для проверки ошибок, но, по крайней мере, лучше.