我正在编写一个函数来返回数字的反转,即它将int(1234)
转换为int(4321)
。这就是我目前所拥有的:
#include <iostream>
#include <cstdlib>
#include <string>
#include <sstream>
using namespace std;
int reverse(int num) {
stringstream ss (stringstream::in | stringstream::out);
string initial;
int reversed;
// read the number in to a string stream
ss << num;
initial = ss.str();
// flush the stringstream
ss.str("");
for(unsigned int i(0); i <= initial.size(); i++) {
ss << initial[initial.size() - i];
}
ss >> reversed;
return reversed;
}
int main(int argc, const char *argv[])
{
int test = 9871;
cout << "test = " << test << endl;
cout << "reverse = " << reverse(test) << endl;
return 0;
}
然而,这只是输出:
test = 9871
reverse = 0
而且我非常肯定问题出在ss >> reversed
行,问题在于reversed
设置为0
而不是ss
的值,但是我无法弄清楚这段代码有什么问题,而且这很令人气愤,因为它看起来应该很简单。有人可以帮忙吗?
由于
答案 0 :(得分:5)
i
从0开始,然后initial.size() - i
超出字符串边界。
更改为ss << initial[initial.size() - i - 1];
并将i
从1重复到initiali.size() - 1
for(unsigned i = 0; i != initial.size(); ++i) {
ss << initial[initial.size() - i -1];
}
或者将i
从1迭代到initial.size()
for(unsigned i = 1; i <= initial.size(); ++i) {
ss << initial[initial.size() - i];
}
答案 1 :(得分:2)
for
循环导致initial
的界限访问超出范围。除Alessandro Pezzato指出的问题外,for
循环中的终止条件需要更改为i < initial.size()
,否则仍会出现超出界限:
for(unsigned int i(0); i < initial.size(); i++) {
ss << initial[initial.size() - i - 1];
}
答案 2 :(得分:2)
最快的C ++ 11执行您想要的方法是:
string s = std::to_string(my_int);
std::reverse(begin(s), end(s));
return std::stoi(s);
答案 3 :(得分:2)
你的问题源于你索引数组的方式,你总是需要在头脑中知道C / C ++和许多类似语言中的索引数组是从零开始的,因为它允许一些计数问题从一开始就很常见。
如果字符串的大小为16个字符,则表示该特定字符串的索引最大值为16-1 = 15,给出范围[0,15]。一般来说,它是size() - 1
。如果initial[initial.size() - 1 - i]
看起来很脏,您可以随时将其设置为maxIndex
之类的临时变量。
int maxIndex = initial.size() - 1;
for(unsigned int i = 0; i <= maxIndex; i++)
{
ss << initial[maxIndex - i];
}
答案 4 :(得分:0)
在我看来,字符串转换使这更复杂。我想我会从int
直接转换为int
:
int reverse(int input) {
static const int base = 10;
int ret = 0;
while (input) {
ret = ret * base + input % base;
input /= base;
}
return ret;
}
请注意,你必须更加精确地处理负数。我使用int
作为输入和输出类型,因为原始的 - 但与原始一样,这只能为非负输入产生合理的结果。