I'm attempting to create my own atoi function. With the following I'm getting a return value of 0. Whatever I change the number variable within the function is what I get as a return value. Any suggestions on modifying the code?
//my atoi function
int atoi_me(char *numstring)
{
int number = 0;
while((*numstring >= '0') && (*numstring <= '9'))
{
number = (number * 10) + (*numstring - '0');
numstring++;
}
return number;
}
int main()
{
char *number[MAXSIZE];
int num;
printf("Please enter a number:\n");
scanf("%c", &number);
num = atoi_me(*number);
printf("%d", num);
return 0;
}
This was not an issue with your
atoi_me()
function, but an issue with how you obtained your input. Your implementation shows some weakness in your understanding of howscanf()
works. That's not a problem in of itself, making mistakes is part of the learning process after all.It is generally safer to gather your input into a buffer first, because
scanf()
from the standard input relies too much on the user of the program to type input exactly the way you expect it. In this case, there is not much harm since you only want a single line of input. But, usually, a program will process multiple lines of input, andscanf()
can jam when an error occurs. So, you can use something like this to get your line of input instead:As mentioned elsewhere,
%c
is the wrong format specifier to use for the input you are gathering. Since you want decimal digits, the*scanf()
family has a format specifier to allow you to only collect those characters.Here, I use the
line
that was retrieved withfgets()
, and parse out the part of the input that contains the digits. The leading space causessscanf()
to skip over space characters leading up to the digits.As I thought, the problem is in your call.
Change your main to.
Other than this it's not a good idea to use scanf - http://c-faq.com/stdio/scanfprobs.html . In this case you should use
fgets
.Since
number
is supposed to be a char array,char number[MAXSIZE];
,&number
but withnumber
, directly :atoi_me(number);
Some comments:
Better to use const type pointer, as you don't intend to modify string contents.
You're declaring an array of
char *
, that is, an array of strings, rather than a single string. You probably want:Your
scanf
format string is wrong. If you want to read a string, you should use%s
.%c
reads only a single character.Your
scanf
parameter is wrong - passnumber
itself (or&number[0]
if you prefer), not&number
.The parameter you're passing to
atoi_me
is wrong. Call it withnumber
(or equivalently&number[0]
), not*number
.Putting all of that together, you should have a
main
routine something like this:Editorial notes: You have a potential buffer overflow with the
scanf
line. You'd be better off using a function likefgets(3)
that makes it easy to protect against that kind of problem.atoi(3)
also traditionally supports negative numbers (with a leading-
) and an optional leading+
for positive numbers, which your implementation doesn't handle.