atoi代码实现

atoi函数

atoi函数是实现数字字符串转整型数,实现代码的时候,要特别注意以下几点:

  1. 前面有空格,调过
  2. 要注意符号,即是正还是负数
  3. 非法输入
  4. 处理溢出

代码实现

int my_atoi(const char *str)
{
    const char *s;
    char c;
    unsigned int cutoff;
    int acc;
    int neg, any, cutlim;

    if(str == NULL)
    {
        errno = EINVAL;
        return false;
    }
    s = str;
    do{
        c = *s++;
    }while(c == ‘ ‘ || c == ‘\t‘);

    if(c == ‘-‘){
        neg = 1;
        c = *s++;
    }
    else
    {
        neg = 0;
        if(c == ‘+‘)
            c = *s++;
    }

    cutoff = neg? INT_MIN : INT_MAX;
    cutlim = cutoff % 10;
    cutoff /= 10;

    acc = any = 0;

    while(c >= ‘0‘ && c <= ‘9‘)
    {
        c -= ‘0‘;
        if(acc > cutoff || (acc == cutoff && c > cutlim))
        {
            any = -1;
            break;
        }
        else
        {
            any = 1;
            acc *= 10;
            acc += c;
        }

        c = *s++;
    }

    if(any < 0)
    {
        errno = ERANGE;
        acc = neg? INT_MIN : INT_MAX;
        return acc;
    }
    else if(any == 0)
    {
        errno = EINVAL;
    }

    else if(neg)
    {
        acc = -acc;
    }

    return acc;
}

测试代码

void Test(const char *str)
{
    errno = -1;
    int result = my_atoi(str);
    if(errno == EINVAL)
        printf("str %s is : EINVAL \n",str);
    else if(errno == ERANGE)
        printf("str %s is : ERANGE  %d \n",str, result);
    else
        printf("str %s is : %d \n",str,result);
}

int main(int argc, char const *argv[])
{
    Test("");

    Test("123");

    Test("+123");

    Test("-123");

    Test("1a33");

    Test("+0");

    Test("-0");

    //有效的最大正整数, 0x7FFFFFFF
    Test("+2147483647");    

    Test("-2147483647");

    Test("+2147483648");

    //有效的最小负整数, 0x80000000
    Test("-2147483648");    

    Test("+2147483649");

    Test("-2147483649");

    Test("+");

    Test("-");

    Test("10522545459");

    Test("-10522545459");

    Test("  +4488");

    Test(" - 321");

    return 0;
}

结果输出如下:

str  is : EINVAL
str 123 is : 123
str +123 is : 123
str -123 is : -123
str 1a33 is : 1
str +0 is : 0
str -0 is : 0
str +2147483647 is : 2147483647
str -2147483647 is : -2147483647
str +2147483648 is : ERANGE  2147483647
str -2147483648 is : -2147483648
str +2147483649 is : ERANGE  2147483647
str -2147483649 is : ERANGE  -2147483648
str + is : EINVAL
str - is : EINVAL
str 10522545459 is : ERANGE  2147483647
str -10522545459 is : ERANGE  -2147483648
str   +4488 is : 4488
str  - 321 is : EINVAL 

参考资料

atoi函数的实现

http://arieshout.me/2012/03/implementation-of-atoi.html

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-09-30 11:49:22

atoi代码实现的相关文章

错误和问题解决的成本

问题描写叙述 错误 数据收集 根本原因 版本号   组件:数据修复           在一个实际成本组织中,(平均,先进先出,后进先出) 一个或更 多的下面情况可能发生: 1.导航到物料成本历史表单上的数量信息,与现有量表单的数量不匹配的记录 2. 一些物料前期已计成本的数量与前面的事务处理历史表单的数量不匹配 3. 全部的库存值报表与事务处理值报表不匹配 4. 存货层次成本更新表单的总数量与现有量数量表单不匹配(只在先进先出/后进先出) 5.这些症状的不论什么一个意味着 MMT-CQL不匹配

立体匹配:关于OpenCV读写middlebury网站的给定的视差的代码

立体匹配:关于OpenCV读写middlebury网站的给定的视差的代码 Middlebury是每个研究立体匹配算法的人不可能不使用的网站,Middlebury提供了许多标准的测试库,这极大地推进了立体匹配算法的进展.Middlebury提供的标准库,其计算出的视差保存在后缀名为.pfm的文件中,Middlebury本身也提供了读取.pfm文件中C++源码和Matlab源码.尽管如此,将源码写成与OpenCV结合的形式是我们更期望的,以下我写的读写.pfm文件的源码.相对于Middlebury给

LeetCode:String to Integer (atoi)

1.题目名称 String to Integer (atoi) (字符串到数字的转换) 2.题目地址 https://leetcode.com/problems/string-to-integer-atoi/ 3.题目内容 英文:Implement atoi to convert a string to an integer. 中文:实现atoi函数,将输入的字符串(String类型)转换为整型数据(Integer类型) 提示:实现的atoi函数需要满足以下特征 忽略字符串第一个非空格字符前的所

String to Integer (atoi) leetcode

题目的意思是要将一个字符串转换成数字 这个题目的重点是要处理    各种各样的输入情况 在题目下面有一大段英文: Requirements for atoi: The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes an opt

【C语言】模拟实现atoi函数

atoi(表示 ascii to integer)是把字符串转换成整型数的一个函数. atoi()函数会扫描参数 nptr字符串,跳过前面的空白字符(例如空格,tab缩进等,可以通过isspace( )函数来检测),直到遇上数字或正负符号才开始做转换,而再遇到非数字或字符串结束时('\0')才结束转换,并将结果返回.如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回0 我们在模拟实现atoi函数时,要注意以下几点: 1.字符串之前的空白问题 2.正负号 3.字符串为空时 4.

LeetCode8 String to Integer (atoi)

题意: Implement atoi to convert a string to an integer.  (Easy) 分析: 就是注意各种特殊情况,边界情况的判断,见代码注释. 1 class Solution { 2 public: 3 int myAtoi(string str) { 4 int start = 0; 5 long long result = 0; 6 int flag = 0; 7 //开头多余空格的处理 8 while (str[start] == ' ') { 9

[leetcode]经典算法题- String to Integer (atoi)

题目描述: 把字符串转化为整数值 原文描述: Implement atoi to convert a string to an integer. Hint: Carefully consider all possible input cases. If you want a challenge, please do not see below and ask yourself what are the possible input cases. Notes: It is intended for

深入应用c++11 随书代码

代码并未在作者github上提供 将书中代码敲至vc 并调试运行 // Client.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" #include <boost/thread.hpp> #include <thread> #include <string> #include "../Common/RWHandler.h" class Connector { public: Connect

软件工程第二周作业:代码规范和代码复审

0x01 :代码规划的要求 Q:这些规范都是官僚制度下产生的浪费大家的编程时间.影响人们开发效率, 浪费时间的东西.(反驳) 首先,我们需要明确编码规范的定义,编码规范同时包括了编码风格和其它规范(代码设计上的规范,如设计模式.程序设计.模块之间的逻辑关联等). 编码风格,牵扯到“缩进.空格使用.注释.命名习惯”等多方面的因素,是依致特定编程语言制定的软件工程开发的“约定”,而相同的编码风格,可以使得软件开发过程中轻松浏览任意一段代码,充分保证不同的开发人员能够依据统一的编码格式轻松理解代码的逻