atoi() 函数如何处理非数字情况?

How atoi() function handles non numeric cases?

我试图编写自己的 atoi() 函数实现,并尝试了两种不同的代码:

#include <stdio.h>
#include <string.h>

int myatoi(const char *string);

int main(int argc, char* argv[])
{
    printf("\n%d\n", myatoi("str"));
    getch();

    return(0);
}  

int myatoi(const char *string){
    int i;
    i=0;
    while(*string)
    {
        i=(i<<3) + (i<<1) + (*string - '0');
        string++;
        // Don't increment i!
    }
    return i;
}

#include <stdio.h>
#include <string.h>

int main() {
    char str[100];
    int x;
    gets(str);
    printf("%d",myatoi(str));
}

int myatoi(char *str) {

    int res =0;
    int i;

    for (i = 0; str[i]!= '[=11=]';i++) {
        res = res*10 + str[i] - '0';
    }
    return res;
}

这两种情况都适用于输入,例如1999.

但如果我偶然传递用户输入,例如"abcd",它正在返回一些数值。我用原来的 atoi() 试过了,在这种情况下它是 returns 0。

谁能给我解释一下如何通过 atoi() 处理非数字输入。

你应该使用isdigit()来查看下一个字符是否是(十进制)数字,如果失败则停止。

您还需要检查并处理前导减号以表示负数。不确定是否--12是否与atoi()有效,可能不是。

另外请不要像那样对乘法进行微优化,现在已经不是 90 年代了。 :)

在你自己的myatoi()函数中,使用isdigit()检查传入指针的每个索引值,return一个0一旦isdigit() 本身 returns 0.