第20题:
题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。
本题看似简单,但是要考虑到容错的各种情况:
1, ptr是空指针吗?
2. 输入字符串前有正负标志位时怎么办?
3. 当输入非数字的字符时,我们不考虑转换问题
4. 考虑溢出问题:模板类
根据不同的需要,int包括以下定义:
unsigned short int 无符号2字节短整形 0 ~ 65535(0~2的16次方-1)
short int 带符号2字节短整形 - 32768 ~ 32767 (2的15次方)
unsigned int 无符号4字节整形 0 ~ 2^32 -1(2147483647)
#include <iostream>
#include <assert.h>
#include <limits>
using namespace std;
void StrtoInt(char* ptr,int& sum)
{
bool minus=false;
assert(ptr!=NULL);
if(*ptr=='-')/*带负号的字符串*/
{
ptr++;
minus=true;
}
while(*ptr!='\0')
{
if(*ptr>='0' && *ptr<='9')/*只对输入是数字的字符进行转换,否则,结束转换函数*/
{
sum=sum*10+*ptr-'0';
if(sum > numeric_limits<int>::max())/*溢出*/
{
cout<<numeric_limits<int>::max()<<endl;
sum=0;
break;
}
ptr++;
}
else
{
sum=0;
break;
}
}
if(minus)
{
sum=0-sum;
}
}
int main()
{
char str[]="345";
int sum=0;
StrtoInt(str,sum);
//cout<<atoi(str)<<endl;直接将字符串转换成整数形式
cout<<sum<<endl;
return 1;
}
小小知识框:对numer_limits模板的常用函数说明:
numeric_limits<short>::max() ,short类型的最大值;2^15-1;
numeric_limits<short>::min(),最小值:-2^15;
numeric_limits<int>::max(),2^31-1
numeric_limits<int>::min(), -2^31
numeric_limits<long>::max() ,2^31-1
numeric_limits<long>::min() ,-2^31
numeric_limits<float>::max() 最大值
numeric_limits<float>::min() 最小正值
numeric_limits<double>::max()
numeric_limits<double>::min()
numeric_limits<long double>::max()
numeric_limits<long double>::min()
numeric_limits<float>::is_specialized(),是否实现了特化
numeric_limits<float>::is_signed(),是否有符号
numeric_limits<float>::is_integer(),是否为整形
numeric_limits<float>::is_exact(),是否精确表示
numeric_limits<float>::is_bounded(),是否存在大小界线
numeric_limits<float>::digits();可以表示的位数(符号位不算)