字符串到Int C ++(stoi)

时间:2019-02-18 05:52:05

标签: c++ string int

我知道这是一个常见问题,但是我没有找到以下代码段为何无效的解释。感谢您对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>函数,但是我无法将其用于此编码挑战。

3 个答案:

答案 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];
}