实现自己的string2int

有些情况下我们需要把数字型字符串转换为相应的整数,例如“123”转为123。

atoi函数
我们可以这么写

#include
int main()
{
  char *p = "123";
  char *p1 = "abc123";
  int num = atoi(p);
  int num1 = atoi(p1);
  std::cout << num << std::endl;
  std::cout << num1 << std::endl;
  return 0;
}

输出为:
123
0
我们可以看到,把数字型字符串转化为了int类型。
当不是数字型字符串时,返回值为0。

istringstream函数
首先别忘了包含头文件:sstream,代码如下:

#include
#include

int main()
{
  char *p2 = "456";
  int num2;
  std::istringstream(p2) >> num2;
  std::cout << num2 << std::endl;

  char *p3 = "a";
  int num3;
  std::istringstream(p3) >> num3;
  std::cout << num3 << std::endl;

  return 0;
}

输出:
456
-858993460
我们看到,如果不是数字型字符串,那么结果就会是垃圾值。

stoi函数

#include
#include

int main()
{
  char *p = "123";
  char *p1 = "abc123"; //错误
  int num = std::stoi(p);
  int num1 = std::stoi(p1);
  std::cout << num << std::endl;
  std::cout << num1 << std::endl;

  return 0;
}

上面都是不写这篇blog的重点,重点是实现自己的MyString2Int

atoi函数的源码:

#include 
#include 
#include 

/* 7.10.1.2 convert decimal string to int */

int __cdecl _ttoi(const _TCHAR *String)
{
    UINT Value = 0, Digit;
    _TCHAR c;

    while ((c = *String++) != _EOS) {

        if (c >= '0' && c <= '9')
            Digit = (UINT) (c - '0');
        else
            break;

        Value = (Value * 10) + Digit;
    }

    return Value;
}

接下来就开始了。

先写个最简单的:

int myAtoi(char *str)
{
    int res = 0; 
    for (int i = 0; str[i] != '\0'; ++i)
        res = res*10 + str[i] - '0';
    return res;
}

但是上面的代码,不是实现负数的转换,那么我们继续改进:

int myAtoi(char *str)
{
    int res = 0;  
    int sign = 1; 
    int i = 0;  

    // If number is negative, then update sign
    if (str[0] == '-')
    {
        sign = -1;  
        i++;  
    }


    for (; str[i] != '\0'; ++i)
        res = res*10 + str[i] - '0';

    return sign*res;
}

等等,上面的代码还没有对非数字型字符串进行处理呢?
先写一个帮助函数,判断一个字符是不是数字:

bool isNumericChar(char x)
{
    return (x >= '0' && x <= '9')? true: false;
}

然后,就可以开始我们的事业了:

int myAtoi(char *str)
{
    if (*str == NULL)
       return 0;

    int res = 0;  
    int sign = 1;  
    int i = 0;  

    if (str[0] == '-')
    {
        sign = -1;
        i++;  
    }


    for (; str[i] != '\0'; ++i)
    {
        if (isNumericChar(str[i]) == false)
            return 0; 
        res = res*10 + str[i] - '0';
    }

    return sign*res;
}

你可能感兴趣的:(C++)