《劍指offer》:[49]把字串轉化成整數

塵虛緣_KY發表於2016-06-25
題目:把字串轉換為整數,也就是實現atoi()。

       類似還有itoa(),將整數數轉化為字串,相反的過程。此題雖然簡單,但是就像高考一樣,簡單的題不一定能做對,能做對的不一定能得分。好吧,下面來看看一看應該注意的地方。

易錯點:

1、判斷字串是否為NULL的情況(這是對字串處理最基本得需要注意的地方)。
2、如何區分字串為NULL時返回的0還是字元'0'返回的0
3、'+''-'號也要算合法輸入,但是也得注意只有'+''-'號的情況;
4、除了'+''-'號外,'0'到'9'之外的數字也算非法輸入
5、考慮溢位的請款,如果字串過長,也就是數字過大後會造成溢位
也許想的還不夠周全,但是至少的注意以上的這些情況。
具體實現程式碼:
#include <iostream>
using namespace std;
enum status{Valid=0,InValid,IsOverFlow};
int InputStatue=Valid; //1.注意輸入為NULL;
int StrToIntCore(const char *strr,bool minus)
{
	long long num=0;
	while(*strr!='\0')
	{
		if(*strr>='0' && *strr<='9')//4.輸入的字元在0-9之外;
		{
			int flag=minus?-1:1;//判斷是正還是負;
			num=num*10+flag*(*strr-'0');
			if(!minus && num>0x7fffffff || minus && num<(signed int)0x80000000)
			//5.判斷溢位情況;最大的正數0x7fffffff;最小的負數0x80000000
			{
				InputStatue=IsOverFlow;
				num=0;
				break;
			}
			strr++;
		}
		else
		{
			num=0;
			break;
		}
	}
	if(*strr=='\0')
		InputStatue=Valid;
	return num;
}
int SteToInt(const char *str)
{
	InputStatue=InValid;
	long long num=0;
	if(str!=NULL && str!='\0')
	{
		bool minus=false;//3.+-號的合法性;
		if(*str=='+')//'+'
			str++;
		else if (*str=='-')//'-'
		{
			str++;
			minus=true;
		}
		if(*str!='\0')
			num=StrToIntCore(str,minus);
	}
	return (int)num;//返回的時候轉換為int;
}
int main()
{
	char *strg[7]={
		"+453434",
		"-342445353",
		"5345734573487537257834",
		"-5345734573487537257834",
		"",
		"+",
		"0"
	};
	int num[7]={8,8,8,8,8,8,8};


	for(int i=0;i<7;i++)
	{
		num[i]=SteToInt(strg[i]);
		switch(InputStatue)//2.返回0的判斷是錯誤輸入還是正常返回;
		{
		case 0:cout<<"the result is:"<<num[i]<<endl;
			break;
		case 1:cout<<"輸入的資料有誤!"<<endl;
			break;
		case 2:cout<<"資料轉換溢位!"<<endl;
			break;
		}
	}


	system("pause");
	return 0;
}

執行結果:


相關文章