我知道这是一个常见问题,但是我没有找到以下代码段为何无效的解释。感谢您对C ++运作的任何见识。
#include <iostream>
using namespace std;
int reverse(int x) {
string s = to_string(x);string s2;
for(int i = s.length(); i != -1; --i){
s2 += s[i];
}
return stoi(s2);
}
int main(){
cout <<reverse(123)<<endl;
}
注意:我知道reverse()
库中的<algorithm>
函数,但是我无法将其用于此编码挑战。
答案 0 :(得分:1)
我建议使用迭代器,以避免范围混淆=)
#include <iostream>
#include <string>
int reverse(int x) {
std::string s = std::to_string(x);
std::string s2;
auto riter = s.rbegin();
while (riter != s.rend()) {
s2 += *riter;
++riter;
}
return std::stoi(s2);
}
int main() {
std::cout << reverse(123) << std::endl;
}
在这里,我使用了反向迭代器。它从容器的结尾开始,然后回到容器的开头。
但是,如果您有或想使用普通的for循环,请更改代码
for(int i = (s.length() - 1); i != -1; --i)
s [s.length()] 指向末尾,这会导致未定义的行为,并且最有可能导致程序崩溃。
答案 1 :(得分:0)
for(int i = s.length(); i != -1; --i)
应该是
for(int i = s.length() - 1; i != -1; --i)
答案 2 :(得分:0)
我假设这是C ++ 11(或更高版本),并且您想反转该值。在这种情况下,由于s[s.length()]
是\0
字符,因此无法正常工作。
因此,您将s2
字符串设置为以下字符:'\ 0','3','2',1',std::stoi
将其解释为空字符串并且由于无法进行转换而抛出std::invalid_argument
异常。
要解决此问题,您需要从i = s.length() - 1
开始迭代:
for (int i = s.length() - 1; i != -1; --i) {
s2 += s[i];
}