VS中C++报错‘Expression: string subscript out of range’求助
问题根源与修复方案:C++加密程序触发“string subscript out of range”错误
问题原因
错误的核心是**encrypted_message初始为空字符串,未分配足够存储空间**:
- 空字符串长度为0,不存在任何下标对应的元素;
- 循环中直接通过
encrypted_message[i]赋值时,i的取值范围是0到secret_message.length()-1,超出了空字符串的有效下标范围,触发下标越界异常; - 循环条件
i >= 0 && i < secret_message.length()本身无问题,问题出在对空字符串的下标操作上。
修复方案
有两种简单有效的修复方式:
方式一:提前为encrypted_message分配空间
在读取secret_message之后,调用resize()方法为encrypted_message分配与原消息相同长度的空间,确保每个下标位置都有对应的元素:
getline(cin, secret_message); // 新增:分配与原消息等长的空间 encrypted_message.resize(secret_message.length());
方式二:使用push_back()追加字符
放弃下标赋值,改用push_back()方法将处理后的字符逐个追加到encrypted_message末尾,无需提前分配空间:
修改循环内的代码为:
if (isalpha(secret_message[i])) { size_t pos = alphabet.find(secret_message[i]); encrypted_message.push_back(key[pos]); } else { encrypted_message.push_back(secret_message[i]); }
完整修复代码示例(方式一)
#include <iostream> #include <string> using namespace std; int main() { string alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; string key = "XZNLWEBGJHQDYVTKFUOMPCIASRxznlwebgjhqdyvtkfuompciasr"; string secret_message; string encrypted_message; string decrypted_message; cout << "What message would you like to encrypt?" << endl << endl; getline(cin, secret_message); encrypted_message.resize(secret_message.length()); for (int i{ 0 }; i < secret_message.length(); i++) { if (isalpha(secret_message[i])) { size_t pos = alphabet.find(secret_message[i]); encrypted_message[i] = key[pos]; } else { encrypted_message[i] = secret_message[i]; } } cout << "Encrypting message...." << endl << "Encrypted Message: " << encrypted_message << endl << endl; }
内容的提问来源于stack exchange,提问作者Perma_Banned_From_Reddit
相关产品推荐
相关产品推荐

