作为更大程序的一部分,我必须将一串数字转换为整数(最终是一个浮点数)。不幸的是我不允许使用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数字后面的不同数值)。
答案 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;
}