面试经典题目 atoi实现 htoi实现

2 篇文章 0 订阅

考察点:

1. 不合法检查

a. NULL 

b. ""

c. "+"

d. "         "

e. "124jio"

2. 溢出情况的处理


基于上述考虑的代码如下,采用一个全局状态变量来处理不合法和溢出情况。

typedef enum{INVALID, VALID} ValidFlag;
ValidFlag flag;
int atoi(const char *s) { 
  char *p; 
  int sign; 
  long long total; 
   
  if (s == NULL || *s == '\0')  
    return flag = INVALID; 
 
  p = s; 
  while (isspace((int)(unsigned int)*p)) 
    p++; 
  sign = (*p == '-') ? -1 : 1; 
  if (*p == '+' || *p == '-'){ 
    ++p; 
  } 
  if (*p == '\0')     // "+" "-" "  "check 
    return flag = INVALID; 
  total = 0; 
  while (isdigit((int)(unsigned int)*p)) { 
    total = total * 10 + (int)(unsigned int)*p - '0'; 
    if (total < 0                     //overflow check  
        || total > (long long)INT_MAX + 1 && sign < 0 
        || total > (long long)INT_MAX && sign > 0) 
      return flag = INVALID; 
    p++; 
  } 
  if (*p == '\0') {    
    flag = VALID; 
    return sign == -1 ? -total : total; 
  } 
  return flag = INVALID; 
} 


与此类似的htoi,只不过多了前缀0x或0X,以及需要处理a-f, A-F,别忘了total = total * 16 + *p - 'a' + 10;

typedef enum {INVALID, VALID} ValidFlag;
ValidFlag flag;

int htoi(const char *s) {
  int sign;
  char *p = s;
  long long total = 0;

  if (s == NULL || *s == '\0')
    return flag = INVALID;
  while(isspace(*p))
    p++;
  sign = (*p == '-') ? -1 : 1;
  if (*p == '+' || *p == '-')
    p++;
  if (*p == '0' && (*(p+1) == 'X' || *(p+1) == 'x'))
    p += 2;
  if (*p == '\0')     //"  " "+" "0x" "-0x" check 
    return flag = INVALID;
  
  while (*p) {
    if (isdigit(*p))
      total = total * 16 + *p - '0';
    else if ('a' <= *p && *p <= 'f')
      total = total * 16 + *p - 'a' + 10; 
    else if ('A' <= *p && *p <= 'F')
      total = total * 16 + *p - 'A' + 10; 
    else 
      return flag = INVALID;
        
    if (total < 0 
        || total > (long long)INT_MAX && sign > 0 
        || total > (long long)INT_MAX + 1 && sign < 0)
      return flag = INVALID;

    p++;
  }
  
  if (*p == '\0') {
    flag = VALID;
    return sign > 0 ? total : -total;
  }
  return flag = INVALID;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值