C++Builder (RAD Studio) 中的范围检查错误
Range check error in C++Builder (RAD Studio)
我在处理字符串数组时遇到“范围检查错误”。据我了解,这意味着我正在使用数组中不存在的索引。
我的 class 和头文件中的函数:
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();
}
设计:
更新前发现错误,“Range Error”没有解决
与从 0 索引的标准 C++ 字符串和数组不同,AnsiString
是从 1 索引的。它的有效字符索引是 1 <= N <= Length
,而不是 0 <= N < Length
,因为您的 for
循环是为它编写的。
此外,在 XOR()
中,return;
不应编译,因为 XOR()
被声明为 return 和 AnsiString
。您需要 return
一个实际值(即 return "";
)或者 throw
一个异常而不是使用 Application->MessageBox()
.
此外,AnsiString output[stext.Length()];
对您的数组来说是 not standard C++. You should use a std::vector
or a System::DynamicArray
。
我在处理字符串数组时遇到“范围检查错误”。据我了解,这意味着我正在使用数组中不存在的索引。
我的 class 和头文件中的函数:
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();
}
设计:
更新前发现错误,“Range Error”没有解决
与从 0 索引的标准 C++ 字符串和数组不同,AnsiString
是从 1 索引的。它的有效字符索引是 1 <= N <= Length
,而不是 0 <= N < Length
,因为您的 for
循环是为它编写的。
此外,在 XOR()
中,return;
不应编译,因为 XOR()
被声明为 return 和 AnsiString
。您需要 return
一个实际值(即 return "";
)或者 throw
一个异常而不是使用 Application->MessageBox()
.
此外,AnsiString output[stext.Length()];
对您的数组来说是 not standard C++. You should use a std::vector
or a System::DynamicArray
。