Creating an atoi function

2020-04-08 16:01发布

问题:

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;
}

回答1:

  1. You're declaring an array of char *, that is, an array of strings, rather than a single string. You probably want:

    char number[MAXSIZE];
    
  2. Your scanf format string is wrong. If you want to read a string, you should use %s. %c reads only a single character.

  3. Your scanf parameter is wrong - pass number itself (or &number[0] if you prefer), not &number.

  4. The parameter you're passing to atoi_me is wrong. Call it with number (or equivalently &number[0]), not *number.

Putting all of that together, you should have a main routine something like this:

int main(void)
{
    char number[MAXSIZE];
    int num;
    printf("Please enter a number: ");
    scanf("%s", number);
    num = atoi_me(number);
    printf("%d\n", num);
    return 0;
} 

Editorial notes: You have a potential buffer overflow with the scanf line. You'd be better off using a function like fgets(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.



回答2:

As I thought, the problem is in your call.

Change your main to.

int main()
{
    char number[MAXSIZE];
    int num;

    printf("Please enter a number:\n");
    scanf("%s", number);
    num = atoi_me(number);
    printf("%d", num);
    return 0;
}

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.



回答3:

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 how scanf() 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, and scanf() can jam when an error occurs. So, you can use something like this to get your line of input instead:

char line[MAXLINESIZE];

if (fgets(line, MAXLINESIZE, stdin) == 0) {
    fprintf(stderr, "no input was provided!\n");
    return 0;
}

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.

char number[MAXSIZE];

if (sscanf(line, " %[0-9]", number) != 1) {
    fprintf(stderr, "no number found in input: %s", line);
    return 0;
}

Here, I use the line that was retrieved with fgets(), and parse out the part of the input that contains the digits. The leading space causes sscanf() to skip over space characters leading up to the digits.



回答4:

Since number is supposed to be a char array,

  • you should declare it as char number[MAXSIZE];,
  • you shouldn't call your function with &number but with number, directly : atoi_me(number);


回答5:

Some comments:

int atoi_me(const char *numstring)...

Better to use const type pointer, as you don't intend to modify string contents.

int main()
{
    char number[MAXSIZE]; // array of chars
    int num;

    printf("Please enter a number:\n");
    scanf("%s", number);     // enter a string, not a char
    num = atoi_me(number);   // pointer to char, not pointer to pointer
    printf("%d", num);
    return 0;
}


标签: c function atoi