Connecting Tech Pros Worldwide Forums | Help | Site Map

question about atoi

pauldepstein@att.net
Guest
 
Posts: n/a
#1: Oct 30 '07
The following description of atoi is pasted from cplusplus.com. My
question is after the pasting.

***** PASTING BEGINS HERE ******

int atoi ( const char * str ); <cstdlib>

Convert string to integer

Parses the C string str interpreting its content as an integral
number, which is returned as an int value.

The function first discards as many whitespace characters as necessary
until the first non-whitespace character is found. Then, starting from
this character, takes an optional initial plus or minus sign followed
by as many numerical digits as possible, and interprets them as a
numerical value.

The string can contain additional characters after those that form the
integral number, which are ignored and have no effect on the behavior
of this function.

If the first sequence of non-whitespace characters in str is not a
valid integral number, or if no such sequence exists because either
str is empty or it contains only whitespace characters, no conversion
is performed.


Parameters
str
C string beginning with the representation of an integral number.

Return Value
On success, the function returns the converted integral number as an
int value.
If no valid conversion could be performed, a zero value is returned.
If the correct value is out of the range of representable values,
INT_MAX or INT_MIN is returned.

**** PASTING ENDS HERE ***************

I don't know whether I'm missing something but this function seems to
have a serious flaw. If the value returned is 0, it seems that the
user can't know if this means no valid conversion or this means the
string begins with "0".

Any comments?

Paul Epstein


Ian Collins
Guest
 
Posts: n/a
#2: Oct 30 '07

re: question about atoi


pauldepstein@att.net wrote:

<snippage>
Quote:
>
I don't know whether I'm missing something but this function seems to
have a serious flaw. If the value returned is 0, it seems that the
user can't know if this means no valid conversion or this means the
string begins with "0".
>
Any comments?
>
Yes, don't use atoi() unless you know for certain the argument will be
in range. Otherwise, use strtol().

--
Ian Collins.
Jack Klein
Guest
 
Posts: n/a
#3: Oct 31 '07

re: question about atoi


On Mon, 29 Oct 2007 20:20:30 -0700, pauldepstein@att.net wrote in
comp.lang.c++:
Quote:
The following description of atoi is pasted from cplusplus.com. My
question is after the pasting.
>
***** PASTING BEGINS HERE ******
>
int atoi ( const char * str ); <cstdlib>
>
Convert string to integer
>
Parses the C string str interpreting its content as an integral
number, which is returned as an int value.
>
The function first discards as many whitespace characters as necessary
until the first non-whitespace character is found. Then, starting from
this character, takes an optional initial plus or minus sign followed
by as many numerical digits as possible, and interprets them as a
numerical value.
>
The string can contain additional characters after those that form the
integral number, which are ignored and have no effect on the behavior
of this function.
>
If the first sequence of non-whitespace characters in str is not a
valid integral number, or if no such sequence exists because either
str is empty or it contains only whitespace characters, no conversion
is performed.
>
>
Parameters
str
C string beginning with the representation of an integral number.
>
Return Value
On success, the function returns the converted integral number as an
int value.
If no valid conversion could be performed, a zero value is returned.
Quote:
If the correct value is out of the range of representable values,
INT_MAX or INT_MIN is returned.
This last statement is completely wrong. Whoever maintains this site
has made a serious mistake. The C++ standard does not specify the
exact behavior of this function, it merely refers to the C standsrd's
definition.

And here is what the C standard specifically states about this
function, which the C++ standard adopts by reference:

"The functions atof, atoi, atol, and atoll need not affect the value
of the integer expression errno on an error. If the value of the
result cannot be represented, the behavior is undefined."

That means that atoi() is not required, and most likely does not,
return INT_MAX or INT_MIN if the value is out of range, instead the
result is undefined behavior.

As Ian said, this function is unsafe for that reason. If you need to
convert a C string directly into numeric input, use strtol() or
strtoul().

See http://jk-technology.com/c/code/strtol.html for an example,
including how to tell the difference between an actual input of 0 and
invalid input.

--
Jack Klein
Home: http://JK-Technology.Com
FAQs for
comp.lang.c http://c-faq.com/
comp.lang.c++ http://www.parashift.com/c++-faq-lite/
alt.comp.lang.learn.c-c++
http://www.club.cc.cmu.edu/~ajo/docs/FAQ-acllc.html
James Kanze
Guest
 
Posts: n/a
#4: Oct 31 '07

re: question about atoi


On Oct 31, 3:57 am, Jack Klein <jackkl...@spamcop.netwrote:

[...[
Quote:
That means that atoi() is not required, and most likely does not,
return INT_MAX or INT_MIN if the value is out of range, instead the
result is undefined behavior.
It's not required to, but as a QoI issue, I certainly would
expect it to. Both VC++ and the libc bundled with Linux do
behave well; I suspect that it is only very old libc bundled
with some traditional Unix which cause problems.

Of course, I'd still recommend something more robust, based on
strtol, but if you have an implementation of reasonable quality,
atoi should work as well.

--
James Kanze (GABI Software) email:james.kanze@gmail.com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34


Closed Thread