C++实现字符串和整数之间的相互转换

来源:互联网 发布:tsp问题算法源代码 编辑:程序博客网 时间:2024/04/30 20:32

参考:http://www.cnblogs.com/GL-BBL/archive/2012/08/19/2646467.html

http://www.cnblogs.com/bluestorm/p/3168719.html

http://blog.sina.com.cn/s/blog_514c89a90100d7qh.html

//字符串转换为整数
//存在严重问题的一个程序,没有考虑到输入的字符串中有非数字字符和正负号,另外还要考虑到最大的正整数和最小的负整数以及溢出,另外如果输入时一个空指针,则程序崩溃
/*int strtoint(char* string)
{
int number=0;
while(*string!=0)
{
number=number*10+*string-'0';
++string;
}
return number;
}*/
#include<iostream>
#include<limits>// limits是STL提供的头文件(包含numeric_limits模板类)
using namespace std;
bool validinput=false;//定义一个全局变量,用于区分输入是否非法,通过检查这个全局变量,可以用来判断转换是否成功,一定要把validinput初始化为false
int strtoint(char* string)
{
long long num=0;//long long 是C99新的长整形,64位,在Win32平台和Win64平台中,其长度都是8Byte,相当于_int64
if(string!=NULL)
{
const char* digit=string;
int sign=0;//符号位,判断输入的字符串中的正负号
if(*digit=='-')
{
sign=-1;
digit++;
}
if(*digit=='+')
{
sign=1;
digit++;
}
while(*digit!='\0')
{
if(*digit<'0'||*digit>'9')//处理输入字符串中有非数字字符,那么终止转换,对于这种不正常的输入返回0
{
num=0;
break;
}
else
{
num=num*10+*digit-'0';
if(num>std::numeric_limits<int>::max())//检查输入是否溢出,如果溢出则返回0,对于这种不正常返回的0和正常返回的0,通过validinput这个全局变量来进行判断
{
num=0;//numeric_limits<int>::max()是int能表示的最大的范围
break;
}
digit++;
}
}
//while循环终止有两种可能,一种是超过范围,或者遇到了字符串中的非数字字符,此时digit不能与‘\0’,另外一种可能是digit='\0'
if(*digit=='\0')
{
validinput=true;//如果运行到了‘\0’说明转换成功
num=sign*num;//把以前字符串的符号位加上,区别正负号
}
}
return static_cast<int>(num);//编译器强制类型转换,把long long整型转换为int整型。注意num两边的括号不要漏掉
}
int main()
{
char* string1=" ";
char* string2=NULL;
char* string3="+12345678";
char* string4="-12345678";
char* string5="+123ab678";
int convertresult=strtoint(string1);
if(validinput==true)
cout<<convertresult<<endl;
else
cout<<"error input"<<endl;
return 0;
}



//要注意正负整数符号位的保存
#include<iostream>
using namespace std;
bool Isnegative=false;
char* numtostr(int num,int length)
{
if(num<0)
{
num=-num;
Isnegative=true;
}
char *buf=new char[length+2];//最后一位放置字符串结束符,并且如果是负数还要留一位放负号
memset(buf,'0',length+1);//从0到length+1即length+2初始化为‘0’
buf[length+1]='\0';//最后一项放结束符
int index=0;
while(num)
{
buf[index++]=num%10+'0'; //result存不满的为全部初始化为‘0’
num=num/10;    
}
if(Isnegative)
buf[index]='-';
char *result=new char[length+2];
for(int i=0;i<length+1;i++)//把buf中从0到length范围工length+1的包括了正负号的值copy到result中,符合打印习惯
result[i]=buf[length-i];
result[length+1]='\0';
return result;
}
int main()
{
int num=-1234567890;
int length=0;
int temp=num;//用来计算输入数字有多少位,不能用num来计算,否则等到传入numtostr中时,num已经为0了
while(temp)
{
length++;
temp/=10;
}
while(temp)
{
length++;
temp/=10;
}
char *result=numtostr(num,length);
if(Isnegative)
for(int i=0;i<length+2;i++)
cout<<result[i];
else
for(int i=1;i<length+2;i++)
cout<<result[i];
cout<<endl;
return 0;
}






0 0
原创粉丝点击