我通常在python中编程,它内置了一个字符串到整数转换器但是当我使用C ++它似乎没有工作所以我决定自己创建。 这就是我到目前为止所做的 C ++:
int strtoint(string str)
{
int values [str.length()];
int return_value = 0;
for (int i=0; i < str.length(); ++i)
if(str.at(str.length()-1-i) == '1')
values[i] = 1;
else if(str.at(str.length()-1-i) == '2')
values[i] = 2;
else if(str.at(str.length()-1-i) == '3')
values[i] = 3;
else if(str.at(str.length()-1-i) == '4')
values[i] = 4;
else if(str.at(str.length()-1-i) == '5')
values[i] = 5;
else if(str.at(str.length()-1-i) == '6')
values[i] = 6;
else if(str.at(str.length()-1-i) == '7')
values[i] = 7;
else if(str.at(str.length()-1-i) == '8')
values[i] = 8;
else if(str.at(str.length()-1-i) == '9')
values[i] = 9;
for (int i=0; i < str.length(); ++i)
return_value += values[i]^(10*i);
return return_value;
}
我似乎得到了非常奇怪的答案,例如"12"
返回13
和"23"
返回11
。
我知道stoi
但我更喜欢自己做,所以我可以学习C ++。
答案 0 :(得分:6)
我可以快速查看三个问题。
首先是
int values [str.length()];
无效的C ++。它使用的是1999 C标准的一个特性,一些C ++编译器支持它作为扩展,但它仍然不是有效的C ++。
第二个是输入中缺少0
s或错误(非数字字符)的处理。
第三是声明
return_value += values[i]^(10*i);
^
是C ++中的按位XOR运算符。不是数学取幂。
其他一些小技巧。
使用迭代器可以大大简化代码。
此外,对于所有标准字符集,罗马数字是连续的,从'0'
开始。因此,将数字转换为所需数字值的简单方法是digit - '0'
,它会将'0'
转换为0
,'1'
转换为1
,... .. '9'
到9
。
答案 1 :(得分:4)
在C ++中,我使用std::stringstream
将std::string
转换为int
。简单示例I found:
#include <sstream>
#include <iostream> //used for cout
int main()
{
std::string str = "12345";
std::istringstream ss(str);
int i;
ss >> i;
if (ss.fail())
{
// Error
}
else
{
std::cout << "The integer value is: " << i;
}
return 0;
}
您可以在@Peter回答中找到代码中的错误。
答案 2 :(得分:0)
您可以使用char转换简化这一点,您只需减去'0'的值并使用迭代器,尤其是反向迭代器,这样可以更简单地计算值。
#include <cmath>
#include <string>
/*! Converts a char to an integer.
* @param c the character to convert
* @return the integer value [0-9] or -1 if not convertible
*/
int chartoint(const char c)
{
auto value = (c - '0');
if (value < 0 || value > 9)
{
value = -1;
}
return value;
}
/*! Converts a string to an integer.
* @param string the string to convert
* @return the converted integer value or 0 if not convertible
*/
int strtoint(const std::string& string)
{
auto integer = 0;
const auto begin = string.rbegin();
for (auto it = begin, end = string.rend(); it != end; ++it)
{
const auto current = chartoint(*it);
if (current == -1)
{
integer = 0;
break;
}
else
{
const auto factor = static_cast<int>(std::pow(10, (it - begin)));
integer += factor * current;
}
}
return integer;
}
试运行:
#include <cassert>
int _tmain(int argc, _TCHAR* argv[])
{
assert(strtoint("1") == 1);
assert(strtoint("1x") == 0);
assert(strtoint("12") == 12);
assert(strtoint("10") == 10);
return 0;
}