天天看点

面试中必须会写的函数源码--------atoi()与itoa()

1.atio()

题目:将字符串转换为整形,函数形式:int StrtoInt(char *string)

如果你将代码写成如下的形式:恭喜你,你被刷了,哈哈。

int StrtoInt(char *string)

{

       int sum = 0;

       char *p= NULL;

       p = string;

    while(NULL! == *p )

       {

              sum = sum*10 + (*p - '0')'

              p++;

       }

       return sum;

}

其实面试官想让你解决的问题包括以下几点:

1.输入的字符串中包含字母以及其他非法字符

2.输入的字符包含正负号

3.要考虑最大的正整数以及最小的负整数小心溢出。

4.输入字符串不能转换为正数时怎么处理

5.输入空指针时怎么处理

int atoi(const char *s)

{

       int dat = 0;

       bool  neg = false;

       if (*s == '-')

       {

              s++;

              neg = true;

       }

       while(*s)

       {

              dat *=10;

              if (*s >= '0' ||*s <= '9')

                     dat+= *s - '0';

              else

                     return -1;

              s++;

       }

       return neg ? (-1*dat) : dat;

}

【代码更近一步改进】

#include<stdio.h>

#include<assert.h>

#define INT_MAX((int)0x7fffffff)

#define INT_MIN((int)0x80000000)

int my_atoi(char * s)

{

       long long result = 0;

       bool reg= false;

       //判断输入合法性

       if(s ==NULL || *s == '\0')

       {

              printf("输º?入¨?为a空?");

              return-1;

       }

       //跳过前边空格

       while(*s== ' ')  //while(isspace(*s)== 0){ s++;}

       {

              s++;

       }

       //判断正负号

       if(*s == '-')

       {

              reg = true;

       }

       if(*s == '+' || *s == '-')

       {

              s++;

       }

       //计算部分

       while(*s!= '\0')

       {

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

              {

                     result = result*10 + (*s - '0');

                     if((reg&& result < INT_MIN) ||(!reg && result > INT_MAX))

                     {

                            return -2;//越界

                     }

              }

              else

              {

                     return-3;//非法字符

              }

              s++;

       }

       returnreg? (result *(-1)):result;

}

int main(int argc,char*argv[])

{

       chara[40]={0};

       intresult;

       printf("输字符数:");

       gets(a);

       result = my_atoi(a);

       printf("%d",result);

       return 0;

}

2.itoa()

//num:待转换的整型变量  str:指向存放结果   radix:基数

char *itoa(int num, char *str, int radix) 

{

    const chartable[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

       char *ptr = str;

       if (num == 0)

       {     //数值为时

              *ptr++= '0';

              *ptr ='\0';

              return str;

       }

       bool  neg = false;

       if (num < 0)

       {     //数值小于时,添加负号,并将指针后移

              neg = true;

              num *= -1;

              *ptr++= '-';

       }

    while (num)

    {

        *ptr++ =table[num % radix];

        num /=radix;

    }

       *ptr = '\0';

       //反转字符串

       char *beg = (neg ? str +1 : str);

       ptr--;

       while (beg < ptr)

    {

        int temp = *beg;

        *beg  = *ptr;

        *ptr  = temp;

              beg++;

              ptr--;

    }

    return str;

}