实现字符串到整数的转换,例如输入字符串“12345”,输出整数12345

首先我们得知道字符串转为整数的核心算法,我们以“12345”为例
核心算法:

int sum=0;
sum=sum*10+str-'0';

str为1时,sum=0*10+1-‘0’=1;
str为2时,sum=1*10+2-‘0’=12;
str为3时,sum=12*10+3-‘0’=123;
str为3时,sum=123*10+4-‘0’=1234;
str为4时,sum=1234*10+5-‘0’=12345;
其中减0是将字符值转化成整数值(1+‘0’=‘1’)

下面是这道题的分析:
题目要求是一串字符串,所以我们需要对这一串字符串进行合法判断:
“”(空字符串)、NULL(空指针)、越界、“+、-、‘ ’ 字符”等字符
如果是非法字符,我们需要进行处理!!!

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <ctype.h>
//定义合法、非法
enum State
{
    VALID,
    INVALID
};
//合法情况只有一种,所以定义状态为非法,当合法条件满足时,另转态转化为合法
enum State state = INVALID;

int my_atoi(const char*str)
{
    int flag = 1;
    long long ret = 0;
    //空指针
    assert(str != NULL);
    //空字符串
    if (*str == '\0')
        return 0;
    while (isspace(*str))
        str++;
    //处理+-号
    if (*str == '+')
        str++;
    else if (*str == '-')
    {
        flag = -1;
        str++;
    }
    //处理正常数字
    while (*str)
    {
        //合法数字
        if (isdigit(*str))
        {
            ret = ret * 10 + (*str - '0')*flag;
            str++;
            if (ret > INT_MAX || ret < INT_MIN)
                return 0;
        }
        //非法不是数字,返回之前算出的ret值
        else
            return (int)ret;    
    }
    //整个字符串判断合法
    state = VALID;
    return (int)ret;
}
int main()
{
    char *p = "5567";
    int ret = my_atoi(p);
    if (state == VALID)
    {
        printf("合法:%d\n", ret);
    }
    else if (state == INVALID)
    {
        printf("非法:%d\n", ret);
    }
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/sifanchao/article/details/80379950
今日推荐