今天我们来看一道经典面试题:编写程序实现字符串到整数的转换,例如输入“12345”,输出整数12345.
首先如果我们不想细究其中的各种情况问题,可以用一个十分简单粗暴的方法来解决。就是库中的atoi函数:它是专门将字符串转换成整数的函数。其次最简单的方法就是通过一个简单的循环得到结果,但是这个方法并不考虑很多情况。
(1)简单法。
#include<stdio.h>
#include<Windows.h>
int change(char *a) //定义函数实现字符串转换为整数。
{
int sum=0;
while(*a!='\0') //循环输出得到结果。
{
sum=sum*10+(*a-'0');
a++;
}
printf("%d\n",sum);
return 0;
}
int main()
{
char a[]="12345";
change(a);
system("pause");
return 0;
}
但是当我们面试时,如果只写这样的代码会让面试官很失望,所以我们在转换的同时还要考虑到如果数字前面有空格,正负号,其他符号,或者最后的结果超越了界限应该怎么办。
(2)完整法。
#include<stdio.h>
#include<Windows.h>
enum RESULT
{
OK,
NO,
}RESULT; //定义一个枚举类型,用来表示最后转换是否成功。
int change(char *a)
{
long long sum=0; //为了防止sum越界,所以定义成long long型。
int flag=1;
while(*a==' ') //当字符串为空格时,往后走。
{a++;}
if(*a=='\0') //如果为'\0',字节返回0.
{
return 0;
}
else if(*a=='+') //如果为+,继续向后移动。
{
flag=flag;
a++;
}
else if(*a=='-') //如果为-,就将flag赋成负值。
{
flag=-flag;
a++;
}
while(*a!='\0') //当*a没完时,进行循环得到sum.
{
if(isdigit(*a)){ //判断是否是数字。
sum=sum*10+(*a-'0')*flag;
a++;
if((sum>INT_MAX) || (sum<INT_MIN)) //判断sum是否越界。
{
RESULT=NO;
sum=0;
break;
}
}
else if(!(isdigit(*a))){ //不是数字就直接退出。
RESULT=NO;
sum=0;
break;
}
}
return (int)sum;
}
int main()
{
int sum=0;
char *a="1234567";
sum=change(a);
if(RESULT==NO)
{
printf("error\n");
}
else
{
printf("Ok! %d\n",sum);
}
system("pause");
return 0;
}
这个方法才是最好的,所以这个题告诉我们以后做题最好要把所有情况都想好并且实现出来,这样的才是好代码。