面试题:字符串转化为数字

        输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串“12345”,则输出整数“12345”。

        本题看似很简单,依次扫描字符串,对于每次扫描到的字符,把在之前得到的数字乘10再加上当前字符表示的数字值即可。但是如果把所有特殊情况都考虑进去并分别给出处理,也不是非常容易的。

         考虑以下测试用例:

        1  考虑数字的符号:输入字符串为正数,负数,0。

        2  考虑溢出。 考虑待处理数据的最大上界与最小下界。若用int保存(32位),则为0x7FFFFFFF与0x10000000(signed  int)

        3  若为异常输入。包括输入字符串为NULL指针,输入字符串为空字符,输入字符串中有非数字字符。

        代码如下:

#include "stdafx.h"
#include 
enum Status {kValid = 0,kInvalid};
int g_nStatus=kInvalid;
using namespace std;

long long StrtoIntCore(const char* digit,bool minus)
{
	long long int num=0;
	while((*digit)!='\0')
	{
		if((*digit)>='0'&&(*digit)<='9')
		{
			int flag;
			if(minus) flag=-1;
			else flag= 1;
			num=num*10+(flag)*((*digit)-'0');
			if(((!minus)&&(num>0x7FFFFFFF))||((minus)&&(num<(signed int)0x80000000)))
			{
				num=0;
				break;
			}
			digit++;
		}
		else 
		{
			num=0;
			break;
		}
	}
	if(*digit=='\0')
	{
		g_nStatus=kValid;
	}
	return num;
}

int StrtoInt(const char* str)
{
	g_nStatus=kInvalid;
	long long num=0;
	if(str!=NULL&&(*str)!='\0')
	{
		bool minus =false;
		if(*str=='+')
		{
			str++;
		}
		else if(*str=='-')
		{
			minus=true;
			str++;
		}
		if(*str!='\0')
		{
			num=StrtoIntCore(str,minus);
		}
	}
	return (int) num;
}
int _tmain(int argc, _TCHAR* argv[])
{
	//char s[]="1234567";
	//char s[]="-123456789";
	//char s[]="0";
        //char s[]="123456789123456789";
	char s[]="-12345678";
	//char* s=NULL;
	//char s[]="-dlakjl";
	int num=0;
	num=StrtoInt(s);
	cout<<"num= "<


你可能感兴趣的:(面试)