我正在编写一个函数来反转字符串的顺序" rdd"到" ddr", 当我运行它时,我得到一个子串超出范围的错误。任何帮助表示赞赏!
#include <iostream>
#include <string>
#include <stdio.h>
#include <ctype.h>
using namespace std;
string reverse(const string & s);
int main() {
cout << reverse("rdd") << endl;
}
string reverse(const string & s) {
string rname(s);
for (unsigned i = rname.size()-1; i >= 0; i--) {
cout << rname[i];
}
return rname;
}
答案 0 :(得分:3)
这是问题:
for (unsigned i = rname.size()-1; i >= 0; i--) {
由于i
未签名,i--
会将其从0
转移到UINT_MAX
。对于unsigned int,测试i >= 0
永远不会失败。发生这种情况后,您可以访问循环体中的界限。
相反,循环可能如下所示:
for (unsigned i = rname.size(); i --> 0; )
(使用--> operator),或者更好的选择是使用C ++习语:
for (auto it = rname.rbegin(); it != rname.rend(); ++it)
cout << *it;
另请参阅reverse adapters,尽管这种情况可能有点过分。
答案 1 :(得分:1)
您的i
是无符号的,因此始终满足条件i&gt; = 0。考虑:
unsigned int i = 0;
i--; // i will undeflow, and assume the largest unsigned number possible
if(i < 0) printf("Works?"); // suprise! It will be false and printf does not fire!
答案 2 :(得分:0)
for (unsigned i = rname.size()-1; i >= 0; i--) {
问题出在上述声明中,因为 -
rname.size()将返回字符串的长度。所以这个循环将从rname.size()-1
运行到0(包括),然后i--将是UINT_MAX
并且条件是i&gt; = 0,将始终为真,但您的字符串大小可能小于{{ 1}}所以它将返回一个超出约束错误的错误。