When using the function atoi
(or strtol
or similar functions for that matter), how can you tell if the integer conversion failed or if the C-string that was being converted was a 0
?
For what I'm doing, 0
is an acceptable value and the C-string being converted may contain any number of 0
s. It may also have leading whitespace.
The proper function (as long as you are insisting on using C-style functions) is strtol
and the conversion code might look as follows
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` */
Some remarks:
strtol
allows (meaning: quietly skips) whitespace in front of the actual number. If you what to treat such leading whitespace as an error, you have to check for it yourself.
The check for *end != '\0'
makes sure that there's nothing after the digits. If you want to permit other characters after the actual number (whitespace?), this check has to be modified accordingly.
P.S. I added the end == number
check later to catch empty input sequences. "All whitespace" and "no number at all" inputs would have been caught by *end != '\0'
check alone. It might make sense to catch empty input in advance though. In that case end == number
check will/might become unnecessary.