剑指offer--字符串转换为整数

本文分享了一个将字符串转换为整数的C++实现案例,包括处理符号、非数字字符及越界情况,并通过多种测试用例验证了其正确性和边界处理。

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

最近在准备找工作,正在看剑指offer,看到一个简单的字符串转换为整数的题

现有可以实现的函数

1.

#include <stdlib.h>
  int atoi( const char *str );

 2.

sscanf(str,"%d",&num)

3.

#include<sstream>

char *str="123";
int num;
stringstream ss(str);
ss>>num;


其实挺简单的,但是考虑的要比较多

1.带符号的情况

2.含有不能转换为整数的字符

3.越界的情况

 

写了一小段代码,实现了功能,但是在逻辑上似乎并不十分的清晰,希望大家批评指正

#include "stdafx.h"
#include <iostream>

using namespace std;

bool str2int(const char *str,int &n)
{
	bool negative=false;
	int num=0,tempnum=0;
	const char *strorigin=str;
	if(str==NULL)
		return false;
	
	if(*str=='-')
	{
		negative=true;
		str++;
	}
		
	if(*str=='+')
	{
		negative=false;
    	str++;
	
	}
	if(*str==0) //空字符串
		return false;
	
	if(strlen(str)>10)  //最大2147483647 最小-2147483648 超过10位肯定越界
	{
		cout<<"error:字符串"<<strorigin<<"所表示的数字大于10位,超过int范围"<<endl;
		return false;
	
	}

	while(*str!=0)
	{
		if(*str>='0'&&*str<='9')
		{
			num=10*num+*str-'0';
			if(num<tempnum)
			{
				if(negative&&num==0x80000000)
				{
					n=num;
					cout<<"success:"<<n<<endl;
					return true;
				}
				else
				{
					cout<<"error:字符串"<<strorigin<<"所表示的数字过大,超过int范围"<<endl;
				         return false;
				}
				
			}

			tempnum=num;
			str++;
		}
		else 
		{
			cout<<"error:字符串"<<strorigin<<"中包含非数字字符!"<<endl;
			num=0;
			return false;
		}
	
	}
	
	if(negative) 
		n=num*(-1);
	else
		n=num;

	cout<<"success:"<<n<<endl;

	return true;

}



int _tmain(int argc, _TCHAR* argv[])
{
	char *str1="-10";
	char *str2=NULL;
	bool flag;
	int n=0xFFFFFFFF;

	int n1=0x80000000;  


	//临界
	flag=str2int("-2147483648",n);  
	flag=str2int("2147483647",n);  

	//越界
	flag=str2int("2147483648",n);
	flag=str2int("-2147483649",n);
	flag=str2int("-2147483649345",n);

    //正常	
	flag=str2int("0",n);
	flag=str2int("-1000",n);
	flag=str2int("1000",n);
	
	
	flag=str2int(str2,n);       //NULL
	flag=str2int("",n);         //空字符串
	flag=str2int("12abc",n);
	
	system("pause");
	return 0;
}


运行结果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值