将一串数字转换为任何形式的int

时间:2012-04-07 22:59:26

标签: c++ types type-conversion

作为更大程序的一部分,我必须将一串数字转换为整数(最终是一个浮点数)。不幸的是我不允许使用cast或atoi。

我认为这是一个简单的操作:

void power10combiner(string deciValue){
   int result;
   int MaxIndex=strlen(deciValue);
        for(int i=0; MaxIndex>i;i++)
        {
          result+=(deciValue[i] * 10**(MaxIndex-i));
        }       
}

会奏效。如何将char转换为int?我想我可以使用ASCII转换,但无论如何我都无法将字符添加到整数中(假设转换方法有一个巨大的if语句,它返回每个ASCII数字后面的不同数值)。

4 个答案:

答案 0 :(得分:2)

有很多方法可以做到这一点,并且可以对您的功能进行一些优化和更正。

1)您没有从函数返回任何值,因此返回类型现在为int。

2)您可以通过传递const引用来优化此函数。

现在举例说明。

使用std::stringstream进行转化。

int power10combiner(const string& deciValue)
{
    int result;

    std::stringstream ss;
    ss << deciValue.c_str();

    ss >> result;

    return result;
}

不使用std :: stringstream进行转换。

int power10combiner(const string& deciValue)
{
    int result = 0;
    for (int pos = 0; deciValue[pos] != '\0'; pos++)
        result = result*10 + (deciValue[pos] - '0');

    return result;
}

答案 1 :(得分:0)

通过建议编辑,并添加了一些解释。

int base = 1;
int len = strlen(deciValue);
int result = 0;
for (int i = (len-1); i >= 0; i--) { // Loop right to left. Is this off by one? Too tired to check.
    result += (int(deciValue[i] - '0') * base); // '0' means "where 0 is" in the character set. We are doing the conversion int() because it will try to multiply it as a character value otherwise; we must cast it to int.
    base *= 10; // This raises the base...it's exponential but simple and uses no outside means
}

这假设字符串只是数字。如果您需要更多说明,请发表评论。

答案 2 :(得分:0)

您可以通过简单地为任意数字库实现place-value系统来迭代地将字符串解析为整数。假设您的字符串以空值终止且数字为unsigned:

unsigned int parse(const char * s, unsigned int base)
{
    unsigned int result = 0;
    for ( ; *s; ++s)
    {
        result *= base;
        result += *s - '0'; // see note
    }
    return result;
}

如上所述,这仅适用于使用数字0,...,9的数字基数最多10个,这些数字保证在执行字符集中按顺序排列。如果您需要更大的数字基数或更自由的符号集,则需要通过适当的查找机制替换指示行中的*s - '0',该机制确定输入字符的数字值。

答案 3 :(得分:0)

我会使用std :: stringstream,但是没有人发布使用strtol的解决方案,所以这里有一个。请注意,它不会执行处理超出范围的错误。在unix / linux上,您可以使用errno变量来检测此类错误(通过将其与ERANGE进行比较)。

BTW,浮点数有strtod / strtof / strtold函数。

#include <iostream>
#include <cstdlib>
#include <string> 


int power10combiner(const std::string& deciValue){
   const char* str = deciValue.c_str();
   char* end; // the pointer to the first incorrect character if there is such
   // strtol/strtoll accept the desired base as their third argument
   long int res = strtol(str, &end, 10);

   if (deciValue.empty() || *end != '\0') {
       // handle error somehow, for example by throwing an exception
   }
   return res;
}

int main()
{
    std::string s = "100";

    std::cout << power10combiner(s) << std::endl;
}