如何实现自己的字符串到整数转换

时间:2016-09-27 12:25:05

标签: c++ string function

所以我想在8302中使用一个字符串,并通过创建自己的函数而不使用stoi / atoi函数将其转换为整数。

我到目前为止尝试过这样做:

int stringToInt(string input)
{
    int i = 0;
    while(input[i] >= '0' && input[i] <= '9')
    {
        input[i] = input[i] * 10 + ......
        i++;
    }
return i;
}

我知道每次找到一个整数时我需要保持乘以10,所以我可以增加它,例如123 = 1 * 10 * 10 + 2 * 10 + 3。但我不知道如何编码。谁能建议一个方法?

6 个答案:

答案 0 :(得分:2)

以递归方式执行此操作可能最简单。使用以下想法:

8302 = 830 * 10 + 2

那是:

  1. 如果字符串中只有一个char - 返回它;否则继续
  2. 分隔字符串中的最后一个char
  3. 使用递归
  4. 将字符串(不包含最后一个字符)转换为整数
  5. 乘以10并添加最后char
  6. 这里有很多细节:

    • 如何将1 char转换为整数? - 从中​​减去'0'
    • 如何将char与字符串的其余部分分开? - 使用substr
    • 当你有一个有效的递归解决方案时,你可能想把它转换成一个迭代的解决方案 - 这会使它更快,但可能更不可读
    • 如何处理无效字符串,例如"aaa""123haha" - 我的算法无法处理

答案 1 :(得分:1)

在定义 char2int 转换之前:

inline int ctoi(char c) {
  switch (c) {
    case '0':
      return 0;
    case '1':
      return 1;
    case '2':
      return 2;
    case '3':
      return 3;
    case '4':
      return 4;
    case '5':
      return 5;
    case '6':
      return 6;
    case '7':
      return 7;
    case '8':
      return 8;
    case '9':
      return 9;
    default:
      throw std::runtime_error("Invalid char conversion");
  }
}

并使用它:

int my_stoi_dec(const std::string& str) {
  int rtn = 0;
  int exp = 1;
  for (auto cp = str.crbegin(); cp != str.crend(); ++cp) {
    char c = *cp;
    if (isdigit(c)) {
      rtn +=  ctoi(c) * exp;
      exp *= 10;
    } else if (c == '+') {
      return rtn;
    } else if (c == '-') {
      return rtn * -1;
    } else {
      throw std::runtime_error("Integer error conversion");
    }
  }
}

答案 2 :(得分:-1)

这个非常接近你的尝试:

int toInt(const std::string& input)
{
  int i = 0;
  for (const auto c : input)
  {
    if (c < '0' || c > '9')
      break;
    i = i*10 + c-'0';
  }
  return i;
}

唯一的假设是字符'0''9'在字符集中直接位于彼此旁边。 if语句确保我们停止在非数字字符处。使用c-'0'将数字字符转换为整数值。

请记住,这只会解析字符串的前几位数字。不会考虑以符号+-开头的字符串。

答案 3 :(得分:-1)

一个好方法是找到你的第一个数字并从那里开始制作一个多人游戏变量并将其乘以每个数字十。对于你添加的每个字符,你必须减去&#39; 0&#39; 0来自它的&#39; 0&#39;不等于int 0。

示例:

 string s = "12346";
 int multiplayer = 1;
 int i = 0;

 int result = 0;

 while (s[i] >= '0' && s[i] <= '9')
 ++i;

--i;
for(i ; i >= 0 ; --i){
   result += (s[i] - '0') * multiplayer;
   multiplayer *= 10;
 }

答案 4 :(得分:-2)

从右到左开始转换要好得多。

因此,您将从结尾处开始迭代字符串,并以字符串开头结束。在每次迭代中,我们将获取该字符,将其转换为int并将其与其multiplier(其在结果整数中的位置)相乘,然后将其添加到最终结果中。

这应该有效:

#include <iostream>
#include <string>

int stringToInt(std::string input)
{
    int result = 0;
    int multiplier = 1;

    for (int i = input.length() - 1; i >= 0; i--) // start from right
    {
        if (input[i] - '0' < 0 || input[i] - '0' > 9) // if any character is not an integer, return maximum negative
        {
            result = INT16_MIN;
            break;
        }

        result += (input[i] - '0') * multiplier; // convert to int, get its position and then add it to result.
        multiplier *= 10; // get next position
    }

    return result;
}

int main()
{
    std::string MyEx = "123456";
    int MyInt = stringToInt(MyEx);

    std::cout << MyInt;

    return 0;
}

答案 5 :(得分:-3)

void enforce( bool b ) {
    if ( !b ) {
        throw std::range_error("Not a valid string to convert to integer");
    }
}

int stringToInt(std::string) {
    for ( std::size_t i( 0 ); i != ( last - first ); ++i ) {
        enforce( ( '0' <= first[ i ] ) && ( first[ i ] <= '9' ) );
        result += pow(10,i) * ( first[ i ] - '0' );
    }
}

Source