question about atoi

P

pauldepstein

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
 
I

Ian Collins

(e-mail address removed) wrote:

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().
 
J

Jack Klein

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.

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
 
J

James Kanze

[...[
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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,954
Messages
2,570,116
Members
46,704
Latest member
BernadineF

Latest Threads

Top