• C

# How do I implement atoi in C ?

How do I implement atoi in C ?

Thanks.
###### Who is Participating?

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Commented:
The easiest way is to step theough the characters in the string and keep a running accumulation:

int atoi(char* p)
{
int num;

num = 0;
while (*p != 0)
{
num = (10 * num) + *p - '0';
p++;
}

That has no real error checking though.

Hope this helps.
0
Commented:
Hi paragm78,

int i;
char * a = "123";
i = atoi(a);

just kidding ... but that is the way to go, unless you can assure us that this is not homework .. since I am suspicious, I'll post some important hints ...
1. you need to derive the numerical value of each char in the string ..eg. int 1 for first digit in 123, int 2 for second digit and so on
2. you need to determine the positional weight of that int ... e.g. 1 needs to multiplied by 100, 2 by 10 and 3 by1 ...
3. all that remains is the add the stuff together

only tricky part here is to determine the weights ... I can think of a few ways ... I'll post hints instead of directly listing them
1. determine the strlen before you start... getting weights then should be trivial
2. use a stack while getting digits .... pop will be in reverse order

Cheers!
Sunny:o)
0
Commented:
Here's a slightly better version with error checking:

int atoi(char* p)
{
int num;
char bNeg;

if (*p == '-')
{
bNeg = 1;
p++;
}
else
bNeg = 0;
num = 0;
while ((*p >= '0') && (*p <= '9'))
{
num = (10 * num) + *p - '0';
p++;
}
if (bNeg)
num *= -1;

return num;
}

Hope this helps.

0

Experts Exchange Solution brought to you by

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Commented:
Hi sunnycoder.

I looked at pragm78's question history and there didn't seem to be any serial homework-asking going on.  I've noticed that some version of embedded C leave out a number of "basic" ANSI functions, so I assume this is a legitimate question.  If it is homework, it's a pretty poor problem.

-Kurt
0
Commented:
If this is for an embedded application where multiplication is an expensive operation you could replace the

(10*num)

by

num << 3 + num << 1

which might be considerably faster depending on the hardware.
0
Commented:
Hi Kurt,

I appreciate that you took time to determine that the question was legitimate (which unfortunately, I did not) ... It indeed looks like I wrong.

Cheers
Sunny
0
Commented:
Don't worry about it Sunny, I only looked because I had the same suspicion.  Paragm78 should keep in mind that to avoid the danger of people thinking that, a little background as to what it is for helps.

Oh, and while num<<3+num<<1 is a neat fast way to do *10, a decent compiler should already do hardware optimizations like that itself.  Especially since on some embeded processors there are even more tricks for speeding up multiplication.  Unless the compiler is non-optimizing it is better to write stuff like that in the simplest way possible and count on the compiler to figure out the best way to do it.

We had a project where hand tuned assembly was transforming an image at 60 frames per second.  I re-wrote the routine in C with no hardware assumptions and used pragma to specify full speed optimization.  The routine ran at 80 frames per second.
0
Commented:
Hi,
The code is as below:

int atoi(char *numStr)
{
int integer=0;
int i;
if (numStr == NULL)
return 0;
for(i=strlen(numStr) -1;i>=0;i--)
{
if( numStr[i] >='0' && numStr[i] <='9' )  /*For Digits*/
{
integer=integer*10+ (numStr[i]-'0');
}
else if(numStr[i] == '-'  && i==0)    /*For sign*/
{
integer=0-integer;
}
else
return 0;
}
return integer;
}

Regards
-Rajesh
0
Commented:
Sorry paragm78 the above code given by me is wrong!!!,
The correct code is as below:

int atoi(char *numStr)
{
int integer=0;
int signflag=0;
int i;
if (numStr == NULL)
return 0;
for(i=0;i<strlen(numStr) ;i++)
{
if( numStr[i] >='0' && numStr[i] <='9' )  /*For Digits*/
{
integer=integer*10 + (numStr[i]-'0');
}
else if(numStr[i] == '-'  && i==0)    /*For sign*/
{
signFlag=1;
}
else
return 0;
}
return signflag?(0-integer):integer;
}

Regards
-Rajesh
0
Commented:
Hi para,
You can replace "signflag" with "signFlag" everywhere in the code to remove errors
0
Commented:
/* Here is another example */

/* function to convert char to int */
int local_atoi(char s[])
{
long int i, n, sign;

for (i = 0; isspace(s[i]); i++);
sign = (s[i] == '-') ? -1 : 1;

if (s[i] == '+' || s[i] == '-')
i++;

for (n = 0; isdigit(s[i]); i++)
n = 10 * n + (s[i] - '0');

return sign * n;
}
0
###### It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
C

From novice to tech pro — start learning today.