Solved

How do I implement atoi in C ?

Posted on 2003-12-09
13
1,040 Views
Last Modified: 2007-12-19
How do I implement atoi in C ?

Thanks.
0
Comment
Question by:paragm78
  • 4
  • 3
  • 2
  • +2
13 Comments
 
LVL 11

Expert Comment

by:KurtVon
ID: 9904263
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
 
LVL 45

Expert Comment

by:sunnycoder
ID: 9904272
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
 
LVL 11

Accepted Solution

by:
KurtVon earned 50 total points
ID: 9904337
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
 
LVL 11

Expert Comment

by:KurtVon
ID: 9904364
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
 
LVL 1

Expert Comment

by:travd
ID: 9906104
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
Top 6 Sources for Identifying Threat Actor TTPs

Understanding your enemy is essential. These six sources will help you identify the most popular threat actor tactics, techniques, and procedures (TTPs).

 
LVL 45

Expert Comment

by:sunnycoder
ID: 9909848
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
 
LVL 11

Expert Comment

by:KurtVon
ID: 9912450
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
 
LVL 1

Expert Comment

by:RajeshTN
ID: 9926545
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
 
LVL 1

Expert Comment

by:RajeshTN
ID: 9926780
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
 
LVL 1

Expert Comment

by:RajeshTN
ID: 9926819
Hi para,
You can replace "signflag" with "signFlag" everywhere in the code to remove errors
0
 

Expert Comment

by:indian_dingo
ID: 9941476
/* 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

Featured Post

How to improve team productivity

Quip adds documents, spreadsheets, and tasklists to your Slack experience
- Elevate ideas to Quip docs
- Share Quip docs in Slack
- Get notified of changes to your docs
- Available on iOS/Android/Desktop/Web
- Online/Offline

Join & Write a Comment

Suggested Solutions

Have you thought about creating an iPhone application (app), but didn't even know where to get started? Here's how: ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ Important pre-programming comments: I’ve never tri…
Windows programmers of the C/C++ variety, how many of you realise that since Window 9x Microsoft has been lying to you about what constitutes Unicode (http://en.wikipedia.org/wiki/Unicode)? They will have you believe that Unicode requires you to use…
The goal of this video is to provide viewers with basic examples to understand how to use strings and some functions related to them in the C programming language.
The goal of this video is to provide viewers with basic examples to understand opening and reading files in the C programming language.

707 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

14 Experts available now in Live!

Get 1:1 Help Now