天天看点

面试题:字符串

字符串是若干字符组成的序列。由于字符串在编程时使用的频率非常高,为了优化,很多语言都对字符串进行了优化。

C/C++中每个字符串都以字符‘\0’为结尾,这样就可以很方便地查到字符串的最后尾部。

为了节省内存,C/C++把常量值保存在单独的一个内存区域。当几个指针赋值给相同的常量字符串时,它们实际上会指向相同的内存地址。如果用常量内存初始化字符串数组,会为它们分配两个长度为n的空间,并把常量值分别复制到数组中去。

面试题1. 实现atoi函数。

enum Status{kValid = 0, kInvalid};
int g_nStatus = kValid;
int atoi(const char * str)
{
     g_nStatus = kInvalid;
     long long num = 0;
     
     if(str != NULL && *str != '\0')//判断是否为空字符串
     {
          bool minus = false;
          if(*str ==  '+')
          {
               str++;
          }
          else if(*str == '-')
          {
               str++;
               minus = true;                                  
          }
          if(*str != '\0')	//用来判断只有‘+’或者‘-’的情况
          {
               num = StrToInt(str, minus);
          }
     }
     return (int)num;
}
int StrToInt(const char * str, int minus)
{
     long long num = 0;
     while(*str != '\0')
     {
          if(*str >= '0' && *str <= '9')
          {
               num = num*10 + (*str - '0');

               if((!minus && num > 0x7FFFFFFF)|| (minus && num < 0x80000000))//用来判断是否溢出
               {
                    num = 0;
                    break;
               }
               str++;
          }
          else	//如果有其他字符
          {
               num = 0;
               break;
          }
     }
     
     if(*str == '\0')	//将标注位g_nStatus位置为0
     {
          g_nStatus = kValid;
     }
     
     int flag = minus?-1:1;
     return num*flag;
}
           

继续阅读