• C

How do I implement atoi in C ?

How do I implement atoi in C ?

Thanks.
paragm78Asked:
Who is Participating?
 
KurtVonConnect With a Mentor 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
 
KurtVonCommented:
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
 
sunnycoderCommented:
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
Become an IT Security Management Expert

In today’s fast-paced, digitally transformed world of business, the need to protect network data and ensure cloud privacy has never been greater. With a B.S. in Network Operations and Security, you can get the credentials it takes to become an IT security management expert.

 
KurtVonCommented:
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
 
travdCommented:
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
 
sunnycoderCommented:
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
 
KurtVonCommented:
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
 
RajeshTNCommented:
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
 
RajeshTNCommented:
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
 
RajeshTNCommented:
Hi para,
You can replace "signflag" with "signFlag" everywhere in the code to remove errors
0
 
indian_dingoCommented:
/* 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
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

All Courses

From novice to tech pro — start learning today.