面试题1:把ASCII码整数字符串转换成对应的整数

来源:互联网 发布:大数据处理过程知乎 编辑:程序博客网 时间:2024/05/02 23:03

题目:

       输入一个表示整数的字符串,把该字符串转换成整数并输出。

       例如输入字符串"345",则输出整数345。

分析:

       首先我们分析如何完成基本功能,即如何把表示整数的字符串正确地转换成整数。还是以"345"作为例子。当我们扫描到字符串的第一个字符'3'时,我们不知道后面还有多少位,仅仅知道这是第一位,因此此时得到的数字是3。当扫描到第二个字符'4'时,此时我们知道前面已经有一个3了,再在后面加上一个数字4,那前面的3相当于30,因此得到的数字是3*10+4=34。接着我们又扫描到字符'5',我们知道'5'的前面已经有了34,由于后面要加上一个5,前面的34就相当于340了,因此得到的数字就是34*10+5=345。分析到这里,我们不难得出一个转换的思路:每扫描到一个字符,我们把在之前得到的数字乘以10再加上当前字符表示的数字。这个思路用循环不难实现。

       由于整数可能不仅仅只含有数字,还可能以'+'或'-'开头,表示整数的正负。因此我们需要把字符串的第一个字符做特殊处理。如果第一个字符是'+',则不需要做任何操作;如果第一个字符是'-',则表明这个整数是个负数,在最后的时候我们要把得到的数值变成负数。

       接着我们处理非法输入。由于输入的是指针,在使用指针之前,我们要做的第一件事是判断这个指针是否为空。如果试着去访问空指针,将不可避免地导致程序崩溃。另外,输入的字符串中可能含有不是数字的非法字符。每当碰到这些非法的字符,我们就没有必要再继续转换。最后一个需要考虑的是溢出问题。由于输入的数字是以字符串的形式输入,因此有可能输入一个很长的数字串转换之后会超过能够表示的最大整数而溢出。

编码:

#include <stdio.h>

#include <limits.h>

 

#define SUCCESS 1

#define FAIL  0

 

int StrToInt(char * str);

int Status = SUCCESS;

 

int main(void)

{

       char * string ="-92147483647";

       int number;

      

       number =StrToInt(string);

       if (FAIL ==Status)

              printf("转换失败,错误码%d\n", number);

       else

              printf("%s转换成整数%d\n", string, number);

      

       return 0; 

}

 

// 把一个ASCII码整数字符串转换成对应的整数

// 错误码0、1、2分别表示空指针、无效字符串、溢出

int StrToInt(char * str)

{

       double num = 0;//保存转换后的整数

       int sign = 0;//记录整数的符号,0正1负

      

       // 判断是否为空指针

       if (NULL == str)

       {

              Status =FAIL;

              return 0;

       }    

       // 判断整数的符号

       if ('+' == *str)

       {

              ++str;

       }

       else if ('-' ==*str)

       {

              sign = 1;

              ++str;

       }

       // 判断是否为仅有一个符号的字符串 "+"或"-"

       if ('\0' == *str)

       {

              Status =FAIL;

              return 1;

       }

       // 转换字符串为对应的整数

       while ('\0' !=*str)

       {

              if(*str>='0' && *str<='9')

              {

                     num= 10*num+(*str-'0');

                     // 判断是否会溢出

                     if( (!sign&&num>INT_MAX) || (sign&&-num<INT_MIN))

                     {

                            Status= FAIL;

                            return2;

                     }

              }

              else

              {

                     Status= FAIL;

                     return1;

              }

              ++str;

       }

       if (sign)

              num =-num;

 

       return (int)num;

}

测试:

输入空指针:0或NULL

空字符串:""

仅有一个符号的字符串:"+"、"-"

以非('+' '-' 数字)开始的字符串:"ab123"

正常输入(可能有正负号):"12345"、"+12345"、"-12345"

正常输入后面接非数字字符:"+123a"

最大的正整数和最小的负整数:"2147483647"、"-2147483648"

溢出:"62147483647"、"-92147483647"

0 0