您的位置:首页 > Web前端

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

2013-05-23 08:27 441 查看
最近在准备找工作,正在看剑指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;
}


运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: