#include <string>
#include <iostream>
using namespace std;
const string& strReverse(const string&);
int main() {
cout << strReverse("POT") << endl;
}
const string& strReverse(const string& s) {
static string ret;
ret = "";
for(string::size_type i = s.length()-1; i >= 0; --i) {
ret += s[i];
}
return ret;
}
Run Code Online (Sandbox Code Playgroud)
上面的代码会导致程序在运行时崩溃.但是,如果我改变的类型i,以int它的工作原理.
这是为什么?我认为使用string::size_type比使用特定类型更"安全" int.使用auto也会导致程序崩溃.
我认为类型可能string::size_type与数组索引不兼容,所以我尝试将索引转换i为int,但这也不起作用.
Dod*_*ion 10
这是因为string::size_type是无符号的,因此for循环的终止条件i >= 0将始终为真.你的选择:
使用int;
继续使用size_type但更改循环:
for(string::size_type i = s.length(); i > 0; --i) {
ret += s[i-1];
}
Run Code Online (Sandbox Code Playgroud)或者我最喜欢的选择:
std::reverse_iterator并在一行中完成整个事情:像这样:
std::string ret(s.rbegin(), s.rend());
Run Code Online (Sandbox Code Playgroud)
一些额外的评论:
不要返回对静态字符串的引用.它不是线程安全的.按值返回(即返回a std::string,而不是a const std::string&).
为了获得更好的性能,请为字符串预分配所需的容量:ret.reserve(s.size());.