0

作为大型程序的一部分,我必须将一串数字转换为整数(最终是浮点数)。不幸的是,我不允许使用铸造或 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

4 回答 4

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;
}
于 2012-04-07T23:11:35.150 回答
0

您可以通过简单地实现任何数字基数的位值系统,将字符串迭代地解析为整数。假设您的字符串以空字符结尾并且数字无符号:

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如所写,这仅适用于使用数字, ...,的以 10 为基数的数字,这些数字9保证在您的执行字符集中按顺序排列。如果您需要更大的数字基数或更自由的符号集,则需要*s - '0'在指示的行中替换为确定输入字符的数字值的合适查找机制。

于 2012-04-07T23:13:57.900 回答
0

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

顺便说一句,浮点数有 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;
}
于 2012-04-07T23:55:05.700 回答
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
}

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

于 2012-04-07T23:03:18.570 回答