题目描述:输入一个表示整数的字符串,并把该字符串转化成整数并输出。例如输入“123”,则输出整数123.
基本思路:以"123"作为例子。当我们扫描到字符串的第一个字符'1'时,我们不知道后面还有多少位,仅仅知道这是第一位,因此此时得到的数字是1。当扫描到第二个数字'2'时,此时我们已经知道前面已经一个1了,再在后面加上一个数字2,那前面的1相当于10,因此得到的数字是1*10+2=12。接着我们又扫描到字符'3',我们已经知道了'3'的前面已经有了12,由于后面要加上一个3,前面的12就相当于120了,因此得到的数字就是12*10+3=123。
特殊处理:1.以+或者-开头表示正负数;2.含有非法字符;3.溢出(上下溢出)。
代码如下:
// StrToInt.cpp : main project file.
//实现将字符串转化为整数的功能
#include "stdafx.h"
#include <iostream>
using namespace std;
//特殊情况:1.字符串为空指针或空串
//2.字符串中有非0到9的字符(负号,#,@,等等)
//特别需要注意的是:还要考虑溢出的问题。正整数最大值0x7FFFFFFF,负整数最小值0x80000000
//函数功能:将字符串str转换为整数, 由参数nInt接收整数值,若转换成功返回true,否则返回false
bool StrToInt(const char *str, int &nInt)
{
if (str == "")
{
cout<<"空串!"<<endl;
return false;
}
else if(str==NULL)
{
cout<<"空指针!"<<endl;
return false;
}
else if ((strcmp(str, "+")==0) || (strcmp(str, "-")==0))
{
cout<<"字符串输入无效!"<<endl;
return false;
}
else
{
char *p=(char *)str;
bool isFirst=true;//标记是否为字符串的第一个字符
bool hasMinus=false;//标记字符串的第一个字符是否为负号
nInt=0;
while(*p!='\0')
{
if(isFirst&&(*p=='-'))
{
hasMinus=true;
p++;
continue;
}
else if (isFirst&&(*p)=='-')
{
p++;
continue;
}
if((*p)>='0' && (*p)<='
9')
{
nInt=nInt*10+(*p)-'0';
if ((!hasMinus && nInt>0x7FFFFFFF) || (hasMinus && nInt<(signed int)0x80000000))//注意此处(signed int)
{
cout<<"字符串数值溢出,输入无效!"<<endl;
return false;
}
p++;
}
else//当前字符为非数字字符
{
cout<<"字符串中包含非数字的字符,不能转换为数字!"<<endl;
return false;
}
}
if(hasMinus)
{
nInt=(-1)*nInt;
}
return true;
}
}
int main(array<System::String ^> ^args)
{
int nTest1=100000000000000;
int nTest2=-1000000000000000;
if(nTest1>0x7FFFFFFF)
{
cout<<"上溢!"<<endl;
}
if (nTest2<0x80000000)
{
cout<<"下溢!"<<endl;
}
int nInt=0;
char *str=NULL;
if(StrToInt("123",nInt))
cout<<nInt<<endl;
if(StrToInt("+123",nInt))
cout<<nInt<<endl;
if(StrToInt("-123",nInt))
cout<<nInt<<endl;
if(StrToInt("@123",nInt))
cout<<nInt<<endl;
if(StrToInt("1@23",nInt))
cout<<nInt<<endl;
if(StrToInt("+",nInt))
cout<<nInt<<endl;
if(StrToInt("-",nInt))
cout<<nInt<<endl;
if(StrToInt("1000000000000000000000000000000000",nInt))
cout<<nInt<<endl;
if(StrToInt("-1000000000000000000000000000000000",nInt))
cout<<nInt<<endl;
system("pause");
return 0;
}