子串超出范围

时间:2015-12-18 00:56:08

标签: c++ for-loop

我正在编写一个函数来反转字符串的顺序" 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;
}

3 个答案:

答案 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}}所以它将返回一个超出约束错误的错误。