(C语言)模拟实现atoi函数

解释:

atoi函数:把整数字符串转换为一个整数

规则:

  1. 如果是空字符串则直接返回0;

  1. 开始如果遇到空格一直往后读取,直到遇到非空字符;如果遇到的第一个非空字符既不是数字也不是正负号

  1. 当遇到负号,则代表atoi函数的返回值是负数;

  1. 继续往后读取,如果正负号后面遇到的是非数,直接返回0;

  1. 如果遇到的是数字,则一直存入某个空间;

  1. 直到读取到非数或者‘\0’,则返回某个空间里的那个数;

函数定义:
int atoi (const char * str);

代码&详解

#define _CRT_SECURE_NO_WARNINGS
#include<string.h>
#include <stdio.h>
#include<assert.h>
#include<ctype.h>
#include <limits.h>

enum Status 
{
    valid,
    invalid
};
enum Status status = valid;//初始化为合法;全局变量status;

enum FLAG
{
    flag1 = 1,
    flag2=-1
};
enum FLAG flag = flag1;
int my_atoi(const char*str)//返回值类型为整形;
{
    //1.空指针问题
      assert(str);
    //2.字符串为空的情况
    if (*str=='\0')
    {
        return 0;
    }
    
   //3.首字符为空格的情况;
    while (isspace(*str))
//isspace函数遇到空格,制表符,换行符等返回非零,否则返回零;头文件为<ctype.h>
    {
        //此处循环意思是遇到空格就一直跳过,直到遇到一个非空格的字符;
        str++;
    }
    //4.正负问题
    
    if (*str=='+')
    {
        
        str++;
    }
    if (*str=='-')
    {
        flag = flag2;
        str++;
    }
    int  n = 0;//创建一个变量n接收字符串转换为整数的值;

    while (*str!='\0')
    {
        if (isdigit(*str))
//isdigit函数意为检查字符是否是(0-9),符合条件返回1,否则返回0;头文件为<ctype.h>
        {
            n = n * 10 + (*str-'0');//算法;
            //溢出问题
            if (n > INT_MAX)
            {
                return INT_MAX;//INT_MAX代表整型的最大值;头文件为<limits.h>
                break;//跳出循环
            }
            if (n < INT_MIN)
            {
                return INT_MIN;//INT_MIN代表整型的最小值;头文件为<limits.h>
                break;
            }

        }
        else
        {
            status = invalid;//遇到字符,非法输出的情况;
            return n * flag;
        }
        str++;
    }
    if (*str == '\0')
    {
        return n * flag;
    }

}



int main()
{
    const char* str = "       -18-5a45";
    int ret=my_atoi(str);//用整形接收;
    if (status==valid)
    {
        printf("合法输出:%d", ret);
    }
    else
    {
        printf("非法输出:%d", ret);
    }
    
    return 0;
}

结果截图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值