字符串下标超出范围C ++:调试

时间:2013-12-11 17:05:33

标签: c++ string debugging assertions

所以我正在调试我得到的运行时错误。 “字符串下标超出范围”。

我知道问题出在哪里以及导致问题的原因,但我正在寻找一种可能以类似或相同的方式执行而不会给我错误的解决方案。

以下是发生错误的代码段。纠正我,如果我错了,问题就出现了,因为我声明了一个0长度的字符串,然后试图操纵第n个元素。

std::string VsuShapeLine::GetRunwayNumber()
{
    std::string name, nbstr, newnbstr, convnbstr;
    int idx,idx2, num, count, pos;
    char buf[3];
    int idx3=-1;
    name = this->GetName();
    idx = name.find("ALight");
    if (idx == -1)
    {
        idx = name.find("Lights");
        idx3 = name.find_last_of("Lights");
    }
    idx2 = name.find('_');
    idx2 +=3;

    nbstr = name.substr(idx2, idx-idx2);

    if (idx3 != -1)
        idx3++;
    else
        idx3 = idx+6;

    if (name.at(idx3) == 'N')
    {
        pos = nbstr.length();
        if (isalpha(nbstr[idx-1]))
            nbstr[pos-1] = _toupper(nbstr[pos-1]);
        return (nbstr);
    }

    else if (name.at(idx3) == 'F')
    {
        convnbstr = nbstr.substr(0,2);
        num = atoi(convnbstr.data());
        num +=18;
        _itoa(num, buf, 10);
        newnbstr = buf;
        count = nbstr.size();

        if (count > 2)
        {
            if (nbstr.at(2) == 'l' || nbstr.at(2) == 'L')
                newnbstr += 'r';

            else if (nbstr.at(2) == 'r'|| nbstr.at(2) == 'R')
                newnbstr += 'l';

            else if (nbstr.at(2) == 'c' || nbstr.at(2) == 'C')
                newnbstr += 'c';
        }
        pos = newnbstr.length();
        if (isalpha(newnbstr[pos-1]))
            newnbstr[pos-1] = _toupper(newnbstr[pos-1]);
        return (newnbstr);
    }

    return ("");
}

1 个答案:

答案 0 :(得分:0)

顺便问一下,对这个问题感兴趣的人就在这条线上:

if (isalpha(nbstr[idx-1])

此时nbstr是一个长度为3且idx'值的字符串,我的程序的工作方式总是9或10.

同样,退休忍者提到检查应该在使用string :: find函数后完成。