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

时间:2015-09-03 14:02:32

标签: c atoi

我试图编写自己的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]!= '\0';i++) {
        res = res*10 + str[i] - '0';
    }
    return res;
}

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

但是,如果我偶然传递用户输入,例如&#34; abcd&#34;,它返回一些数值。我用原始atoi()尝试了它,并且在这种情况下返回0。

有人可以向我解释如何通过atoi()处理非数字输入。

2 个答案:

答案 0 :(得分:6)

您应该使用isdigit()查看下一个字符是否是(十进制)数字,并在失败时停止。

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

另外请不要微观优化这样的倍数,不再是90年代了。 :)

答案 1 :(得分:0)

在您自己的myatoi()函数中,使用isdigit()检查传入指针的每个索引值,并在0自身返回{{1}后立即返回isdigit() }}