字符串转int函数:

函数名:Myatoi(*str)

功能:将一串字符串转成int整形数字

注意事项:

1.int型最大取值范围:2147483647,int型占4字节,即4*8 = 32位二进制,整数在二进制中用原码表示即可,第一位为符号位0表示正数,即:01111111 11111111 11111111 11111111,十六进制(HEX)表示为:0fff ffff,十进制计算方法为:2^31 – 1;最小值:十六进制为:0x80000 0000(HEX),二进制为:10000000 00000000 00000000 00000000(BIN),十进制计算方法为:-1*2^31。

2.编程时,我第二次用了分开计算正数和负数的方法。由于第一次计算正数,得出负数时是把sum × (-1),这样计算就会有bug。因为正数的最大值为2147483647,所以×(-1)得到的负数最小值为-2147486947,而不是0x8000 0000(HEX)。

3.注意int类型和char类型一样是,表示的范围是循环的,我们知道char类型范围是:-128  — 127 ,如果char a = 127,b = a+1;那么b就为-128;

所以int同理,我们可以用sum>0或者sum<0判断sum是否超出的正数或者负数的表示表示范围。例如:我们求sum为整正数,sum = sum*10 +*str – ‘0’,此时sum为2147483647,sum再加一个1 ,就超出了int表示的正数范围,2147483647 + 1 为 -2147483648 ,这是一个负数了,此时sum<0,所以sum = MAXINT(最大int正数)。

同理sum表示负数时,若sum一直减,减到最小后再减就>0了,此时就可以退出循环,sum = MININT就ok了。

4.先写了10进制的情况;十六进制和八进制的情况,不需要像10进制一样考虑 负号和正号。

5.用到的几个字符函数:

isdigit();//判断字符是否为数字

isxdigit();//判断参数字符是否为16进制字符,即A-F,a-f

toupper();//如果参数字符是小写字母,则转化成大写字母

6.将字符转化为int整数时候:

如果是数字字符,’a’ – ‘0’ 减字符0即可。

如果是字母,‘B’ – ‘A’ +10;//表示11。16进制的计算时要用到

7.还有一个问题:十六进制和八进制的sum判断是否超出范围,在定义sum时将其定义为long long类型,进行加法加法运算时候,if(sum >maxint),就退出循环,返回maxInt。再将最后的结果转化为int类型。

程序用例:

#include<ctype.h>

#include<assert.h>

#include<stdio.h>

#define MAXINT  0x7fffffff //int范围内的最大正数

#define MININT  0x80000000 //最小的负数

int Str_To_Int_DEC(char *str)//10进制

{

int sum = 0;

int flag = 1;//判断正负数 1表示正数 -1 表示负数

bool first_sum = true;//做负数运算时 判断第一次运算是否执行

while(*str == ' ')

{

str++;

}

if(*str == '-')

{

flag = -1;

str++;

}

else if(*str == '+')

{

str++;

}

while(isdigit(*str))

{

if(flag == 1)

{

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

str++;

if(sum < 0)

{

return MAXINT;

}

}

else if(flag == -1)

{

if(first_sum == true)

{

sum = -(*str-'0');//第一个数为负数

str++;

first_sum = false;

}

else if(first_sum == false)

{

sum = sum*10 - (*str - '0');

str++;

}

if(sum > 0)

{

return MININT;

}

}

}

return sum;

}

int Str_To_Int_HEX(char *str)//16进制
{
    long long sum = 0;
    while(*str == ' ')
    {
        str++;
    }
    while(isxdigit(*str))//int isxdigit();功能:如果参数是十六进制数字字符(即:A-F, a-f, 0-9),函数返回非零值,否则返回零值。
    {
        if(isalpha(*str))
        {
            sum = sum*16 + toupper(*str) -'A'+10;//如果是字母的话
            str++;
        }
        else if(isdigit(*str))
        {
            sum = sum*16 + *str -'0';
            str++;
        }
        if(sum > MAXINT)
        {
            sum = MAXINT;
            break;
        }
    }
    return (int)sum;
}
int Str_To_Int_OCT(char *str)//8进制
{
    long long sum = 0;
    while(*str == ' ')
    {
        str++;
    }
    while(*str>= '0' && *str <= '7')
    {
    
        sum = sum*8 + *str -'0';
        str++;
        if(sum > MAXINT)
        {
            sum = MAXINT;
            break;
        }
    }
    return (int)sum;
}

int Myatoi(char *str)

{

assert(str != NULL);

int result;

while(isspace(*str))

{

str++;

}

if(*str == '0')

{

str++;

if(*str == 'x' || *str == 'X')

{

str++;

result = Str_To_Int_HEX(str);

}

else

{

result = Str_To_Int_OCT(str);

}

}

else

{

result = Str_To_Int_DEC(str);

}

return result;

}

int main()

{

char *str1 = "321564";

char *str2 = "2147483647";

char *str3 = "2147483648";

char *str4 = "+326549875646156";

char *str5 = "-321564";

char *str6 = "-2147483648";

char *str7 = "-2147483649";

char *str8 = "0x7fffffff";

char *str9 = "80000000";

char *str10 = "0x654ab";

char *str11 = "0Xbbb";

printf("%d\n", Myatoi(str1));

printf("%d\n", Myatoi(str2));

printf("%d\n", Myatoi(str3));

printf("%d\n", Myatoi(str4));

printf("%d\n", Myatoi(str5));

printf("%d\n", Myatoi(str6));

printf("%d\n", Myatoi(str7));

printf("%d\n", Myatoi(str8));

printf("%d\n", Myatoi(str9));

printf("%d\n", Myatoi(str10));

printf("%d\n", Myatoi(str11));

return 0;

}

下面是十进制的测试结果:

字符串转int:处理8,10,16进制以及处理无效字符相关推荐

  1. C# 中2,10,16进制及其ASCII码之间转化

    转载连接: http://blog.csdn.net/pengfeihe0123/article/details/7278221 C# 中2,10,16进制及其ASCII码之间转化           ...

  2. Python进制转换的完全实现——2/10/16进制原/补码互转

    一.需要转换的几种情况 不带符号位的整数 2进制 10进制 16进制 2进制 – bin2dec() bin2hex() 10进制 dec2bin() – dec2hex() 16进制 hex2bin ...

  3. 字符串(含中文)转16进制,16进制转字符串(含中文)

    字符串(含中文)转16进制 public static byte[] SendS(String str){byte[] ok = new byte[0]; try {ok = str.getBytes ...

  4. 16进制转string java_java的2/10/16进制转换和字符串数字转换

    十进制转成十六进制: Integer.toHexString(int i) 十进制转成八进制 Integer.toOctalString(int i) 十进制转成二进制 Integer.toBinar ...

  5. C语言之10/16进制字符串和数字转换(四)

    #include <stdio.h> #include <stdlib.h>int main() {//1.将10进制和16进制字符串转换成数字char a[] = " ...

  6. gb2312的字符串(包括中午)转16进制字符串以及反转义原始字符

    参考文章: https://blog.csdn.net/weixin_42696271/article/details/114100244 /*** 中文字符串转16进制* gb2312编码字符串转义 ...

  7. 将字符串转换为与之对应的16进制字符串

    在C的编程中, 有时需要将字符串转换为对应的16进制的ASCII码字符串并显示出来.这里是我参考网上代码写的转换程序: 该程序分为两个部分: 一.先将字符串转换为对应的16进制的数值 int Str2 ...

  8. JS实现2,8,10,16进制的相互转换

    // 10进制转为16进制 var a=1234567890; console.log(a.toString(16)) //499602d2// 16进制转为10进制 var num=parseInt ...

  9. 2,8,10,16进制转换

    先上个例子,方便以后复习,例子看不明白,说明算法已经忘了,再看详细分解 2->8 (1000)2 = 分解为001.000 左边=0*2^2+0*2^1+1*2^0=1 右边=0*2^2+0*2 ...

最新文章

  1. 论电子计算机在审计中的应用,计算机技术在审计中的应用领域分析.doc
  2. docker-3-常用命令(上)
  3. 【题解】洛谷P1541 [NOIP2010TG] 乌龟棋(类似背包的DP)
  4. LeetCode LCP 28. 采购方案(排序 + 二分查找)
  5. html富文本编辑器插件_vue中使用vuequilleditor富文本编辑器
  6. Netty工作笔记0062---WebSocket长连接开发
  7. 排序合并连接(sort merge join)的原理
  8. armboot和内核文件系统烧写总结
  9. play home tifa_144Hz OLED屏手机 努比亚Play喜提Android 11_手机通讯
  10. 9、网络详解 学习笔记
  11. 分库分表中间件sharding-jdbc的使用
  12. Js脚本之jQuery学习笔记(1)
  13. Sensor信号输出YUV、RGB、RAW DATA、JPEG 4种方式区别
  14. 【企业】任正非:管理的灰度
  15. 产品全生命周期的产品结构和配置管理构架
  16. kindeditor html上传本地图片
  17. 你总是喜欢抓不住的东西
  18. 网页中的三种地址详解
  19. NPOI 设置EXCEL单元格格式为 数值
  20. mysql数据库,mysql数据库监控介绍

热门文章

  1. 《网络安全攻防系列课程》全面升级啦!悄悄告诉你可以免费学哦!
  2. input绑定的jedate日期控件的值改变时触发事件问题
  3. 网站使用实体服务器没备案可以么,服务器域名没备案能https吗?
  4. H3CIE-RS+笔试易错题整理
  5. 【Altium Designer】常用快捷键大全
  6. OpenVSwtich(OVS)Vlan间路由实战 附实验环境
  7. 时间序列的平稳性检验与随机性检验
  8. HTML5 在线新闻浏览
  9. (完美)华为畅玩5 CUN-AL00的Usb调试模式在哪里开启的步骤
  10. Macbook Pro的120Hz XDR高刷屏很好,但也没那么好