Snažím sa zistiť, či existuje alternatívny spôsob konverzie reťazca na celé číslo v jazyku C.
V mojom kóde sa pravidelne vyskytuje nasledujúci vzor.
char s[] = "45";
int num = atoi(s);
Existuje teda lepší alebo iný spôsob?
Existuje strtol
, ktorý je IMO lepší. Tiež som si obľúbil strtonum
, takže ak ho máte, použite ho (ale nezabudnite, že nie je prenosný):
long long
strtonum(const char *nptr, long long minval, long long maxval,
const char **errstr);
Mohli by vás tiež zaujímať strtoumax
a strtoimax
, ktoré sú štandardnými funkciami v jazyku C99. Môžete napríklad povedať:
uintmax_t num = strtoumax(s, NULL, 10);
if (num == UINTMAX_MAX && errno == ERANGE)
/* Could not convert. */
V každom prípade sa držte ďalej od atoi
:
Volanie atoi(str) je ekvivalentné:
(int) strtol(str, (char **)NULL, 10)
s výnimkou toho, že spracovanie chýb sa môže líšiť. Ak hodnota nemôže byť reprezentovať, správanie je nedefinované.
Nepoužívajte funkcie zo skupiny ato...
. Sú nefunkčné a prakticky nepoužiteľné. Mierne lepším riešením by bolo použitie funkcie sscanf
, hoci ani tá nie je dokonalá.
Na prevod reťazca na celé číslo by sa mali používať funkcie zo skupiny strto...
. Vo vašom konkrétnom prípade by to bola funkcia strtol
.