繁体   English   中英

C++Builder (RAD Studio) 中的范围检查错误

[英]Range check error in C++Builder (RAD Studio)

我在使用字符串 arrays 时遇到“范围检查错误”。 据我了解,这意味着我正在使用数组中不存在的索引。

我的 class 和我的 header 文件中的函数:

AnsiString toBin(int n) {
    AnsiString zero = "0";
    int len;
    AnsiString result;
    while (n != 0) {
        result += (n % 2 == 0 ? "0" : "1");
        n /= 2;
    }
    len = result.Length();
    while (result.Length() < 8)
        result = zero + result;
    return result;
}
                    
int toInt(AnsiString bin) {
    int start = 1;
    int result = 0;
    for (int i = 0; i < 8; i++) {
        result += (int)bin[i] * start;
        start * 2;
    }
    return result;
}
                
class enc_dec {
private:
    AnsiString stext;
    AnsiString skey;
                
public:
    enc_dec(AnsiString t, AnsiString k) {
        stext = t;
        skey = k;
    }
                
    AnsiString XOR() {
        if (skey == "") {
            Application->MessageBox(L"Error!", L"No Key", MB_OK);
            return "";
        }
        AnsiString cry = "";
        int key = skey[1] + 0;
        AnsiString keyBin = toBin(key);
        AnsiString temp = "";

        // AnsiString output[stext.Length()];
        std::vector<AnsiString>output;
        for (int i = 1; i < stext.Length(); i++) {
            temp = toBin(stext[i]);
            for (int j = 1; j < 8; j++) {
                if (temp[j] == keyBin[j])
                    temp[j] = '0';
                else
                    temp[j] = '1';
            }
            output.push_back(temp[i]);
        }
        for (int i = 0; i < stext.Length(); i++)
            cry += char(toInt(output[i]));
        return cry;
    }
};

我的.cpp文件:

void __fastcall TForm1::Button1Click(TObject *Sender){
    enc_dec temp(Edit1->Text,Edit2->Text);
    temp.XOR();
}

该设计:

图片

我在更新之前发现了一个错误,“范围错误”尚未解决。

与标准的 C++ 字符串和 arrays 是 0 索引的不同, AnsiString是 1 索引的。 它的有效字符索引是1 <= N <= Length ,而不是0 <= N < Length ,因为您的for循环是为编写的。

此外,在XOR()中, return; 不应该编译,因为XOR()被声明为返回AnsiString 您需要return一个实际值(即return ""; )或者throw异常而不是使用Application->MessageBox()

此外, AnsiString output[stext.Length()]; 不是标准 C++ 您应该为数组使用std::vectorSystem::DynamicArray

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM