函数名:atoi

功能: 把一个字符串转换成一个整数。

看似简单,主要是情况太多,需要注意考虑。

测试代码:

Test(NULL);
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("-");

详细代码:

#pragma once

long long StrToIntCore(const char* str, bool minus);

enum Status
{
kValid = 0,//合法输入
kInvalid //非法输入
}; int g_nStatus = kValid; //一个全局状态控制,初始化为合法 int StrToInt(const char* str)
{
g_nStatus = kInvalid; //非法
long long num = 0; //装最后返回的整数结果 if (str != NULL && *str != '\0')
{
bool minus = false;//是不是负号,初始化为不是
if (*str == '+') //考虑正号
str++;
else if (*str == '-')
{
str++;
minus = true; //是负号,minus置为真
} if (*str != '\0')
{
num = StrToIntCore(str, minus);
}
} return (int)num;
} long long StrToIntCore(const char* digit, bool minus)
{
long long num = 0; while (*digit != '\0') //正负号处理完成
{
if (*digit >= '0' && *digit <= '9')
{
int flag = minus ? -1 : 1; //整正负结果
num = num * 10 + flag * (*digit - '0'); if ((!minus && num > 0x7FFFFFFF) //正数最大
|| (minus && num < (signed int)0x80000000)) //负数最小
{
num = 0;
break;
} digit++;
}
else //出现非法字符
{
num = 0;
break;
}
} if (*digit == '\0') //这种‘\0’为合法
{
g_nStatus = kValid;
} return num;
} void Test(char* string)
{
int result = StrToInt(string);
if (result == 0 && g_nStatus == kInvalid)
printf("the input %s is invalid.\n", string);
else
printf("number for %s is: %d.\n", string, result);
} void _Test()
{
Test(NULL); 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("-");
}

分析:

1.有几种情况都是返回零,但是需要知道分别是什么情况,就用一个全局量g_nStatus去控制,是合法零还是非法零
2.minus控制整数的正负,true就是负号;
3.是非法输入,都有g_nStatus状态控制,在输出的时候,判断输出零时,g_nStatus的状态;

测试结果:




赐教!

库函数atoi的更多相关文章

  1. 标准库函数atoi的实现

    标准库函数atoi用于将字符串类型的数据转换为整形数据:在转换过程中要考虑空指针.空字符串"".正负号,溢出等情况 这里是将字符串str转换为32位整型,其正数的最值为0x7FFF ...

  2. 转载 C++常用库函数atoi,itoa,strcpy,strcmp的实现

    C++常用库函数atoi,itoa,strcpy,strcmp的实现 C语言字符串操作函数 1. 字符串反转 - strRev2. 字符串复制 - strcpy3. 字符串转化为整数 - atoi4. ...

  3. 【C语言】编写函数实现库函数atoi,把字符串转换成整形

    //编写函数实现库函数atoi.把字符串转换成整形 #include <stdio.h> #include <string.h> int my_atoi(const char ...

  4. 库函数atoi()的实现

    int atoi(const char *nptr); 假设第一个非空格字符存在,是数字或者正负号则開始做类型转换,之后检測到非数字(包含结束符 \0) 字符时停止转换.返回整形数. 否则,返回零. ...

  5. [Swift]库函数atoi:将字符串内容转换为整数

    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs. ...

  6. [重写库函数]atoi

    算法分析 1. 若字符串开头是空格,则跳过所有空格,到第一个非空格字符,如果没有,则返回0. 2. 若第一个非空格字符是符号+/-,则标记isPositive的真假,这道题还有个局限性,那就是在c++ ...

  7. 算法练习-字符串转换成整数(实现atoi函数)

    练习问题来源 https://leetcode.com/problems/string-to-integer-atoi/ https://wizardforcel.gitbooks.io/the-ar ...

  8. 如何实现字符串转换成整数(实现atoi内置函数)?

    题目描述 输入一个由数字组成的字符串,把它转换成整数并输出.例如:输入字符串"123",输出整数123. 给定函数原型int StrToInt(const char *str) , ...

  9. 转:C语言字符串操作函数 - strcpy、strcmp、strcat、反转、回文

    转自:C语言字符串操作函数 - strcpy.strcmp.strcat.反转.回文 C++常用库函数atoi,itoa,strcpy,strcmp的实现 作者:jcsu C语言字符串操作函数 1. ...

随机推荐

  1. 求小于n的素数个数

    本文是对 LeetCode Count Primes 解法的探讨. 题目: Count the number of prime numbers less than a non-negative num ...

  2. 简述Spring事务有几种管理方法,写出一种配置方式

    Spring事务有两种方式: 1.编程式事务:(代码中嵌入) 2.声明式事务:(注解,XML) 注解方式配置事务的方式如下: 首先,需要在applicationContext.xml中添加启动配置,代 ...

  3. LVS-NAT模式的配置详解

    由于实验室拟态存储的项目需要通过NAT模式来映射NFS服务器已实现负载均衡的目的,通过调研了多种负载均衡机制,笔者最终选择了LVS的NAT模式来实现需求,接下来通过博客来记录一下LVS-NAT模式的配 ...

  4. 视频直播技术(七):Ijkplayer切换网络时停止播放的问题处理

    问题起因: 在进行ijkplayer播放器的测试时,发现ijkplayer播放器在切换网络时出现直播画面停止的问题. 问题分析: 抓取日志发现:tv.danmaku.ijk.media.player. ...

  5. 数组Array、数组API

    1.数组:批量管理多个数据的存储空间. 数组的作用:现实中,批量管理多个数据都是集中分组存放,良好的数据结构,可极大提高程序的执行效率! 优点:方便查找 2.创建数组:(4种方式) (1)var 变量 ...

  6. java中阻止类的继承

    1.使用final来修饰类 final表示这个类是继承树的末端,不能被继承. 2.将类的构造方法声明为private的,再提供一个static的方法来返回一个类的对象. JAVA语言要求继承时必须在构 ...

  7. MyBatis笔试题

    1请写出Mybatis核心配置文件MyBatis-config.xml的内容? <?xml version="1.0" encoding="UTF-8"? ...

  8. Unity3D 打包Standalone(exe文件) Shader丢失

    Shader丢失算是老生常谈了 从刚开始接触Unity时,从别的地方拿过来模型导入 就认识了一个标志性的颜色 就是粉色,或者是紫色 当在Unity中遇到这种颜色 不用怀疑 绝对是Shader或者材质丢 ...

  9. spark source code 分析之ApplicationMaster overview(yarn deploy client mode)

    一直不是很清楚ApplicationMaster的作用,尤其是在yarn client mode和cluster mode的区别 网上有一些非常好的资料,请移步: https://blog.cloud ...

  10. 破解ServiceStack.Redis每小时6000次限制

    在.net里我们操作Redis常用的组件就是ServiceStack.Redis了,但是这个从4.0版本后开始商业化了,我们在使用的时候, 会有很多限制: 1.类型限制, 类型限制是20,这个组件自带 ...