这是一个加密程序,应该使用rot13加密来加密和解密消息。当我运行该程序时,它会吐出一堆废话,然后告诉我该程序“已停止工作。”
#include <iostream>
using namespace std;
char lookup(bool, char);
class Cipher{
public:
string encrypt(string);
string decrypt(string);
};
string Cipher::encrypt(string text) {
return text;
}
string Cipher::decrypt(string text) {
return text;
}
class Rot13: public Cipher {
public:
string encrypt(string);
string decrypt(string);
};
string Rot13::encrypt(string text) {
string modstring;
for(int i=0;i<text.length();i++) {
modstring+=lookup(true,text[i]);
}
return modstring;
}
string Rot13::decrypt(string text) {
string modstring;
for(int i=0;i<text.length();i++) {
modstring+=lookup(false,text[i]);
}
return modstring;
}
char lookup(bool b, char c) {
string norm = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
string rot13 = "NOPQRSTUVWXYZABCDEFGHIJKLMnopqrstuvwxyzabcdefghijklm";
if (c==' ')
return c;
if(b){
for(int i=0;i<52;i++) {
if(norm[i]==c)
return rot13[i];
}
}
else {
for(int i=0;i<52;i++) {
if(rot13[i]==c)
return norm[i];
}
}
}
string encrypt_with(Cipher *cipher, string text) {
cipher->encrypt(text);
}
string decrypt_with(Cipher *cipher, string text) {
cipher->decrypt(text);
}
int main(){
string s = "The quick brown fox jumped over the lazy dog";
Rot13 *rot13;
rot13 = new Rot13;
string d = encrypt_with(rot13,s);
string e = decrypt_with(rot13,d);
cout << d << endl;
cout << e << endl;
return 0;
}
答案 0 :(得分:2)
您需要在基地中虚拟encrypt
和decrypt
个功能:
class Cipher{
public:
virtual string encrypt(string);
virtual string decrypt(string);
};
这是因为他们在encrypt_with
和decrypt_with
内调用了基类,因此基本函数被调用,因为它们没有被标记为虚拟。我还建议将它们抽象化,因为在基础密码的实例上加密和解密并不是真的有意义:
class Cipher{
public:
virtual string encrypt(string) = 0;
virtual string decrypt(string) = 0;
};
顺便说一句,使用调试器会很快发现这一点 - 我建议熟悉您的工具设置所附带的调试器,因为它是不可或缺的技能
代码中的另一个问题是,如果找不到该字符,查找不会返回任何内容,这样您就会有垃圾。您是否想要进行一些错误检查(可能会抛出异常?)或返回已知值。
编辑:此外,正如Leiaz指出我们的encrypt_with和decrypt_with应该从他们对cypher对象的调用中返回值:
string encrypt_with(Cipher *cipher, string text) {
return cipher->encrypt(text);
}
string decrypt_with(Cipher *cipher, string text) {
return cipher->decrypt(text);
}