与这个美丽的世界说再见的atoi——使用字符串来判断是否溢出

探究在linux下和windows下atoi函数在溢出处理的区别 最近在复习数据结构刷leetcode的时候突然出现了一个问题。 上面这是题目,当然简单的做肯定简单,我想用atoi和to_string函数,然后就出现问题了。 本来我在windos本机测试,当数字正溢出的时候,atoi返回的数字都是INT_MAX,然后就想当然拿aoti函数测试,如果返回的数字是INT_MAX的时候,就表示溢出了直接返回0. 然后提交之后,死活就不对,查看了一下执行结果,... 阅读详情

/*
题目1:(简答题:10.0分)
编程实现将字符串转换为整型数;
int my_atoi(const char *str);
1.遇到非数字字母,停止转换;
示例: str = “234.324” ; 返回值是234;
2.首先出现空格的字符串可以转换,转换开始后,遇到空格停止转换;
示例: str =" 342 456"; 返回值是342;
3.可以处理正负号;
示例: str = " +234.bad" ; 返回值是 234; str = " -342ab.234" ; 返回值是:-342;
4.可以处理八进制,和十六进制;
示例: str = " +0xff"; 返回值是 255; str = " 0123" ; 返回值是 83;
5 可以处理int 型溢出的情况;
示例; str = “567898765678987656789”; str = 2147483647; (INT_MAX 宏在 limits.h 头文件中)
str = "-234324665544325345325; str = - 2147483648; (INT_MIN 宏在limits.h 头文件中)
*/

#include <iostream>
#include <ctype.h>
#include <limits.h>
#include <stack>

using namespace std;

const  char * HEX_MAX = "7fffffff";
const  char * DEC_MAX = "2147483647";
const  char * OCT_MAX = "17777777777";
const  char * HEX_MIN = "80000000";
const  char * DEC_MIN = "2147483648";
const  char * OCT_MIN = "20000000000";
const  int HEX_LEN = 8;
const  int DEC_LEN = 10;
const  int OCT_LEN = 11;


//对字符创进行筛选,截取到有用的字符串,返回值为字符串有效长度,
//用来进行比较,16进制下,会将大写字母变成小写字母进行存储
int  Screen_str(char *des,const char*src,int sys)
{
    int i = 0;
    if(sys == 8)
    {
        while(src[i] != '\0' && isdigit(src[i]) && i <= OCT_LEN)
        {
            des[i] = src[i];
            ++i;
        }
    }
    else if(sys == 10)
    {
        while(src[i] != '\0' && isdigit(src[i]) && i <= DEC_LEN)
        {
            des[i] = src[i];
            ++i;
        }
    }
    else if(sys == 16) 
    {
        while(src[i] != '\0' && i <= HEX_LEN && (isdigit(src[i])|| isalnum(src[i])))
        {
            if(isdigit(src[i]))//如果是数字
            {
                des[i] = src[i];
            }
            else if(isalnum(src[i]))//如果是字母
            {
                char x = src[i];
                x = tolower(x);
                des[i] = x;
            }
            ++i;
        }
    }
    printf("%d\n",i);
    return i;
}


//判断是否发生越界问题,1发生越界,0刚好到达临界值,-1没发生越界
int Judge_boundary(const char*str,bool tag,int sys)
{
    char  tmp[12] = {0};
    int tmp_len = Screen_str(tmp,str,sys);
    if(sys == 10)
    {
        if(tmp_len  > DEC_LEN)
        {
            return 1;
        }
        else if(tmp_len  == DEC_LEN)
        {
            if(tag)
            {
                return strcmp(tmp, DEC_MAX);
            }
            else
            {
                return strcmp(tmp, DEC_MIN);
            }
        }
    }
    else if(sys == 8)
    {
        if(tmp_len  > OCT_LEN)
        {
            return 1;
        }
        else if(tmp_len  == OCT_LEN)
        {
            if(tag)
            {
                return strcmp(tmp, OCT_MAX);
            }
            else
            {
                return strcmp(tmp, OCT_MIN);
            }
        }
    }
    else if(sys == 16)
    {
        if(tmp_len  > HEX_LEN)
        {
            return 1;
        }
        else if(tmp_len  == HEX_LEN)
        {
            if(tag)
            {
                return strcmp(tmp, HEX_MAX);
            }
            else
            {
                return strcmp(tmp, HEX_MIN);
            }
        }
    }
    return -1;
}

//十进制
int  dec_atoi(const char*str,bool tag)
{
	int  sum = 0;
	int i = 0;
    if(Judge_boundary(str,tag,16) != -1)
    {
        if(tag)
        {
            return  INT_MAX;
        }
        return  INT_MIN;
    }
	while(str[i] != '\0' && isdigit(str[i]))
	{
        sum = sum*10+str[i] - '0';
        i++;
	}
	if(tag == false)
	{
		return sum*-1;
	}
	return sum;
}

//八进制
int oct_atoi(const char *str,bool tag)
{
	int sum = 0;
	int i = 0;
    if(Judge_boundary(str,tag,8) != -1)
    {
        if(tag)
        {
            return  INT_MAX;
        }
        return  INT_MIN;
    }
	while(str[i] != '\0' && isdigit(str[i]) && isdigit(str[i]) < 8)
	{
        sum = sum*8+str[i] - '0';
        i++;
	}
	if(tag == false)
	{
		return sum*-1;
	}
	return sum;
}


//十六进制的情况
int  hex_atoi(const char*str,bool tag)
{
	int  sum = 0;
	int i = 0;
    if(Judge_boundary(str,tag,16) != -1)
    {
        if(tag)
        {
            return  INT_MAX;
        }
        return  INT_MIN;
    }
	while(str[i] != '\0' && (isdigit(str[i]) || isalnum(str[i])))
	{
		char x = str[i] - '0';
		if(isdigit(str[i]))//如果是数字
		{
            sum = sum*16+str[i] - '0';
		}
		else if(isalnum(str[i]))//如果是字母
		{
			char x = str[i];
			x = tolower(x);
            sum = sum*16+(x-'a'+10);
        }
         i++;
	}
	if(tag == false)
	{
		return sum*-1;
	}
	return sum;
};


int  my_atoi(const char *str)
{
	if(str == NULL) return -1;
	int num = 0;
	bool flag = true;//1 + ,0 -
	while(*str == ' ') str++;
	while(*str != '\0')
	{
		if(*str == '-')
		{
			flag = false;
		}
		if(*str == '+')
		{
			flag = true;
		}
		if(*str == '0') 
		{
			if(*(str+1) == 'x' || *(str+1) == 'X')//十六进制
			{
				num = hex_atoi(str+2,flag);
				break;
			}
			else 
			{
				num = oct_atoi(str+1,flag);
				break;
			}
		}
		if(isdigit(*str))
		{
			num = dec_atoi(str,flag);
			break;
		}
		str++;
	}
	return num;
}

int main()
{
    char str[][20]= {"0xdadad65"};
    int n = sizeof(str)/sizeof(str[0]);
    for(int i = 0;i < n;++i)
    {
        cout<<str[i]<<"  -->  "<< my_atoi(str[i])<<endl;
    }
}
soul聊天协议逆向 通过观察上面的CFG发现,该混淆符合以下逻辑,整体思路就是先查找主分发器,一般被引用次数最多的那个块就是主分发器,引用主分发器的块大概率是真实块,再使用unicorn模拟执行,遍历每一个分支,记录每一个块,如果某一个块是上次记录的块则也为真实块,无后继的块则为retn块,剩下的就是无用块。通过Frida Hook libc.so后发现,聊天协议走的是JAVA层的socket,然后Hook JAVA层相关函数得到如下调用堆栈。里面调用的函数不是很多,所以。不行不行,革命要彻底! 阅读详情

相关推荐

kubernetes rook 安装 cephfs

ceph root kubernete osd uuid partuuid

天津托的博客 1543

atoi函数的详细实现(考虑溢出)

atoi()函数的功能:将字符串转换成整型数。atoi()会扫描参数str字符串,跳过前面的空白字符,直到遇上数字或正负号才开始做转换,而再遇到非数字或字符串时('\0')才结束转化,并将结果返回(返回转换后的整型数)。 写atoi函数的时候需要注意一下几点 1. 忽略字符串前的空白字符 2. 字符串所表示数值的正负号 3. 结束条件,遇到非数字或者字符'\0'结束 4. 考虑溢

辉 8069

5.44GHz超高精度!STM32G474的HRTIM时钟配置避坑指南

本文深入解析STM32G474内置高分辨率定时器的时钟配置要点,帮助工程师避开常见陷阱。文章详细阐述了从系统时钟到5.44GHz等效时基的路径,重点分析了预分频器乘法器、周期计算溢出、影子寄存器同步等关键配置,并结合实测波形对比,确保HRTIM在电机控制、数字电源等精密应用中发挥极限性能。

book8的博客 523

strtoul-atoi-atol-itoa

将字符串转换成无符号长整型数:strtoul   strtoul (将字符串转换成无符号长整型数)   相关函数   atof,atoi,atol,strtod,strtol   表头文件   #include   定义函数   unsigned long int strtoul(const char *nptr,char **endptr,int base);   函数说明   strtoul()会将参数nptr字符串根据参数base来转换成无符号的长整型数。参数 base范围从2至36

sanfengshou的专栏 1263

PCB布局布线要求及多层电路板叠加原则

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考本文主要针对PCB布局布线中的要点进行了总结,并对多层电路板的叠加原则进行了解释。

Ka_wyb的博客 2934

【零基础入门unity游戏开发——3D篇】3D物理关节 —— Joint相关组件

【零基础入门unity游戏开发——3D篇】3D物理关节 —— Joint相关组件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1202

将一个十六进制字符串转换为十进制数值的问题

在程序中,我们有时需要将一个十六进制字符串转换为十进制数字。比如:char *ptr="0x11";int n=0;//我们想让n等于0x11,即17通常我们在C中,想将一个字符串转换为一整形数字,通常会使用下面的方法:char *ptr="123"; int n=0;n=atoi(ptr);printf("%d/n",n);//输出:123

delphiwcdj的专栏 6万+

ESP32设备驱动-直流电机与L298N电机驱动器

在本文中,我们将介绍如何使用ESP32通过L298N电机驱动器驱动直流电机。

视觉与物联智能 3593

atoi和itoa函数及负数转正数时溢出问题

首先贴出c函数库里的atoi函数, 其实是atol函数, 因为atoi调用了atol函数. 函数很简单,相信大家一看就懂. isspace函数是判断传入字符是否为空白符, 空白符指空格, 水平制表, 垂直制表, 换页, 回车和换行符. 函数首先跳过空白字符, 之后判断正负号, 判断完正负号后判断字符是否为数字, 如果是则循环, 直到遇到非数字为止, 如果第一次循环就不是数字则直接返回 tota

u012410778的专栏 8036

【C语言趣味教程】(0) 专栏介绍

这是一套C 语言趣味教学专栏,目前正在火热连载中,欢迎猛戳订阅!本专栏保证篇篇精品,继续保持本人一贯的幽默式写作风格,当然,在有趣的同时也同样会保证文章的质量,旨在能够产出"有趣的干货" !本系列教程不管是零基础还是有基础的读者都可以阅读,可以先看看目录!标题前带星号 (*) 的部分不建议初学者阅读,因为内容难免会超出当前章节的知识点,面向的是对 C 语言有一定基础或已经学过

有道无术, 术尚可求。有术无道, 止于术。 2万+

深度学习中常用的几种卷积(下篇):膨胀卷积、可分离卷积(深度可分离、空间可分离)、分组卷积(附Pytorch测试代码)

膨胀卷积也称为扩张卷积或空洞卷积,一般可通过对标准二维卷积的卷积核设置合适的膨胀率(具体地指卷积核元素之间的距离)实现。合理利用膨胀卷积可在不引入其他参数的同时,扩大输出中元素的感受野,提高特征的全局表示能力。下面通过展示几个不同膨胀率下的卷积核大小以及感受野变化情况,可以更直观的理解:图中灰色为输入,蓝色为卷积核,黄色为输出。1)dilation=1:表示卷积核元素之间距离为1,使用0进行大小为dilation-1=0的填充(这是默认情况),因此。

NorthSmile的博客 9014

1.3 LeetCode总结(线性表)_滑动窗口

编程总结 每每刷完一道题后,其思想和精妙之处没有地方记录,本篇博客用以记录刷题过程中的遇到的算法和技巧 双指针尤其要注意用例出现超时; 切记直接暴力两层循环解题,能用左右指针使用双指针解题。 ...

凡物加倍磨治,皆能变化气质 2660

OpenCode + Oh My OpenCode:打造你的终极AI编程团队(OpenCode新手入门指南)

本文详细介绍了开源终端AI编程助手 OpenCode 的完整配置教程 🖥️,从安装、AI模型配置到增强插件 Oh My OpenCode 的部署一应俱全。支持 Claude、ChatGPT、Gemini 多模型切换 🤖,还能实现多AI智能体协作开发。步骤清晰适合新手 📝,想在终端用AI写代码的开发者不要错过 ✨

XiaoqiangClub的博客 1万+

atoi实现,考虑溢出等各种情况

代码中有详细的注释,应该比较好理解。代码提交leetcode,验证通过int myAtoi(char* str) { if (str == NULL || *str == ‘\0’) return 0;/* 跳过开始的空格*/ while (isspace(*str)) str++;/* 第一个非空格字符,判断是否为‘+’或‘-’ */ int minus =

bdc789的专栏 719

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

字符串转整数(atoi) 十进制实现

atoi实现

Net_Wolf_007的专栏 1732

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

关于atoi和atol转换超过10位数字字符串溢出问题

一、问题 atoi( const char *str )和atol(const char *str )转换超过10位的字符串,转换失败 二、分析 atoi函数返回的int取值范围:-2147483648 ~ 2147483647 atol函数返回的long int取值范围:-2147483648 ~ 2147483647 10位数超过int和long int的取值范围 三、解决 使用函数_atoi64函数替换 原型:_int64 _atoi64(const char *_String) ..

Jonton_Lee的博客 3571

char类型0xff转int细节

char 类型占一个字节。8位    0000 0000 char b = 0xff  为 1111 1111 其中一号位为符号位,为1,则说明为负数(int类型)。 1111 1111按位取反 1000 0000. 再加1——> 1000 0001 所以char b = 0xff 转为int类型结果为-1。

DoVoid的博客 7664

My_atoi--字符串转换为数值,并伴有进制转换!

实现一个My_atoi函数: 实现一个int My_atoi(const char* buff),将buff中的数值字符串转换为数值,并且该函数支持十六进制与八进制 例如:char *buff = " 0xff.14",返回255,char *buff = " afda0123"返回83. 分析: 这个题字面意思看起来很简单,就是将字符串中的数值字符串转换为数值并将其返回,但是这个题中有许多的细节都容易被忽略掉: 1.在开始转换之前遇到非所需转换字符时跳过该字符,在开始转换时遇到非所需转换字符就停止转换

qq_44777506的博客 416

c语言字 字符串转换成数组_C语言常用的一些转换工具函数!

1、字符串转十六进制代码实现:voidStrToHex(char*pbDest,char*pbSrc,intnLen){charh1,h2;chars1,s2;inti;for(i=0;i{h1=pbSrc[2*i];h2=pbSrc[2*i+1];s1=toupper(h1)...

weixin_39946798的博客 2814

[M模拟] lc8. 字符串转换整数 (atoi)(模拟+溢出判断+溢出特判)

文章目录1. 题目来源2. 题目解析方法一:模拟+溢出判断+溢出特判 1. 题目来源 链接:lc8. 字符串转换整数 2. 题目解析 方法一:模拟+溢出判断+溢出特判 就纯模拟题,思路: 去除前导连续空格。 正负号的判断。 先不考虑符号,直接进行计算。long long 不用管,如果这个无符号的值超过了 INT_MAX 则跳出循环。但是 int 就需要特判了。 判断完了还得再特判一个 -2147483648 这个值。对于 INT_MIN 是合法的,而针对于 INT_MAX 是非法的。即当前 res=214

Y-puyu 的博客 262

LeetCode 8. 字符串转换整数 (atoi)(判断是否越界是重点)

2020年7月24日 周五 天气贼热 【不悲叹过去,不荒废现在,不惧怕未来】 本文目录1. 大概思路2. 判断是否越界(重点)3. 完整代码参考文献 LeetCode 8. 字符串转换整数 (atoi) 这道题的难度虽然是中等,但不是很难,就是需要考虑的情况有点多。 1. 大概思路 去掉前导空格 处理正负号 识别数字(注意越界情况) 2. 判断是否越界(重点) 如果只是简单地字符串转整数的话,就是简单地 ans = ans * 10 + digit。 但是注意这道题目可能会超过整数的最大表示, 也

m0_37433111的博客 522

C语言实现 atoi功能包括 (1)判断溢出输出最大值最小值(2)智能匹配字符 (3)16进制和8进制转化 (4)正负数

#define _CRT_SECURE_NO_WARNINGS #include <stdlib.h> #include <string.h> #include <stdio.h> #include <ctype.h> #include <assert.h> #include <limits.h> //使用查看当前结果...

GoingJack博客 1010
上一篇: 点分十进制表示的字符串转换为 unsigned int 整型数值
下一篇: BST——C++
恩嗯
博客等级 码龄8年 47粉丝 112原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值