《剑指offer》:编程实现字符串到整数的装换,模拟实现函数atoi

本文介绍了一个atoi函数的实现,该函数可以将字符串转换为整数,并详细讨论了如何处理非数字字符、正负号及空格等问题,同时考虑了整数溢出的情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

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

函数atoi

atoi 是把字符串转换成整型数的一个函数。包含在头文件stdlib.h中。
  函数原型:
  int atoi(const char *nptr);
  参数nptr字符串,如果第一个非空格字符存在,是数字或者正负号则开始做类型转换,之后检测到非数字(包括结束符 \0) 字符时停止转换,返回整型数。否则,返回零。
  

函数分析

  • 如果输入的字符包含不全是数字字符的字符。(例如:“123adc”.)

  • 如果在数字字符前面有正负号又该怎么处理。( 例如:”-123”、“+123”.)

  • 当输入的字符串前面几个字符都是空格怎么处理。(例如:“ 123”)

  • 当输入的字符串中没有数字时,我们应该返回什么呢?返回0合适吗?

  • 当字符串中的字符数字转化的整数太大,溢出问题怎么解决

  • 怎么区分返回的是非法的0,还是字符串装换的0呢?所以我们可以设置一个全局变量state,来记录合法和非法返回

代码实现


#include<stdio.h>
#include<assert.h>
#include<ctype.h>
#include<stdlib.h>
#include<limits.h>

enum State
{
    VALUE,//合法状态
    NOVALUE//非法状态
};
enum State state = NOVALUE;
int my_atoi(const char *str)
{
    int flag = 1;//标识正负数的
    long long ret = 0;
    assert(str != NULL);
    //空字符串,返回非法的0
    if (*str == '\0')
    {
        return 0;
    }
    //前面如果是空白字符,跳过,isspace函数判断字符是否为空格,如果是返回非0,如果不是,返回0
    while (isspace(*str))
    {
        str++;
    }
    if (*str == '+')
    {
        str++;
    }
    //处理负数
    else if (*str == '-')
    {
        str++;
        flag = -1;
    }
    while (*str)
    {
        //isdigit函数判断一个字符是否是数字,是返回非零,不是返回零
        if (isdigit(*str))
        {
            ret = ret * 10 + (*str - '0')*flag;
            //溢出问题
            if (ret > INT_MAX || ret < INT_MIN)
            {
                return 0;
            }
        }
        else
        {
            return (int)ret;
        }
        str++;
    }
    state = VALUE;
    return (int)ret;
}
int main()
{
    char *p = "     -123a";
    int ret=my_atoi(p);
    if (state == VALUE)
    {
        printf("%d\n", ret);
    }
    else
    {
        printf("字符串非法,无法转换\n");
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值