Намагаюсь з'ясувати, чи існує альтернативний спосіб перетворення рядка в ціле число у мові C.
У моєму коді регулярно зустрічається наступний шаблон.
char s[] = "45";
int num = atoi(s);
Отже, чи є кращий спосіб або інший шлях?
Існує strtol
, який, на мою думку, є кращим. Також мені сподобався strtonum
, тому використовуйте його, якщо він у вас є (але пам'ятайте, що він не портативний):
long long
strtonum(const char *nptr, long long minval, long long maxval,
const char **errstr);
Вас також можуть зацікавити strtoumax
і strtoimax
, які є стандартними функціями у C99. Наприклад, ви можете сказати
uintmax_t num = strtoumax(s, NULL, 10);
if (num == UINTMAX_MAX && errno == ERANGE)
/* Could not convert. */
У будь-якому випадку, тримайтеся подалі від atoi
:
Виклик atoi(str) повинен бути еквівалентний:
(int) strtol(str, (char )NULL, 10) (int, char , NULL, 10) за винятком того, що обробка помилок може відрізнятись. Якщо значення не може бути представити, то поведінка не визначена.
Не використовуйте функції з групи ato...
. Вони зламані і практично не приносять користі. Трохи кращим рішенням буде використання sscanf
, хоча і воно не є досконалим.
Для перетворення рядка в ціле число слід використовувати функції з групи strto...
. У вашому конкретному випадку це буде функція strtol
.
Так, ви можете зберігати ціле число безпосередньо:
int num = 45;
Якщо потрібно розібрати рядок, то atoi
або strol
виграє конкурс "найменша кількість коду".