我正在编写一个程序,该程序输入用于加密句子的字母顺序以解密它(只是替换字符)。我需要输入它的单词数,但我使用的方法不需要,所以我只是输入它,什么也不做(这并不重要,因为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字符,这是没有意义的。