用于解密由CodeBlocks组成的简单句子的代码在不输出单个字符的情况下崩溃



我正在编写一个程序,该程序输入用于加密句子的字母顺序以解密它(只是替换字符)。我需要输入它的单词数,但我使用的方法不需要,所以我只是输入它,什么也不做(这并不重要,因为AI将只验证程序的输出)。我想我想出了一个不错的算法,但在我输入加密句子后,程序总是崩溃。我试着改变了很多东西,但似乎没有解决这个问题。此外,我很抱歉在代码中没有任何意义的东西,我只是一个初学者。请帮我防止程序崩溃,这样我才能在明天结束之前提交。

这是我的代码

#include <iostream>
#include <string>
using namespace std;
int main()
{
int n, i, j;
string key, encrypted;
cin >> key;
char alphabet[]={'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
cin >> n;
getline(cin>>ws, encrypted);
for (i=0;i<=encrypted.size();i++)
{
for (j=0;j<encrypted.size();j++)
{
if (encrypted[i]==key[j])
{
cout << alphabet[j];
}
else if (encrypted[i]==key[j]+32)
{
cout << alphabet[j]+32;
}
else if (encrypted[i]==' ')
{
cout << " ";
}
}
}
}

你的程序有以下错误:

第一个错误:

正如在注释部分已经指出的那样,您应该更改

for (j=0;j<encrypted.size();j++)

for (j=0;j<key.size();j++)

第二个缺陷:

由于整数提升,表达式alphabet[j]+32;将计算为int类型的值,而不是char。这意味着

cout << alphabet[j]+32;

将打印一个数字,而不是一个字符。因此,必须将表达式的结果强制转换回数据类型char,如下所示:

cout << static_cast<char>( alphabet[j]+32 );

第三个错误:

cout << " ";

应该只在每次外部循环迭代中调用一次,即对字符串encrypted中的每个字符调用一次。但是,每次内循环迭代调用它一次,这意味着每个字符调用它几次。因此,您应该将该语句从内循环中删除,并将其放入外循环中。

第四个错误:

for (i=0;i<=encrypted.size();i++)

是错误的。应该是<而不是<=。否则,您还将处理字符串的结束null字符,这是没有意义的。

最新更新