c ++程序无法正常运行

时间:2015-04-26 18:09:39

标签: c++

这是一个加密程序,应该使用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;
}

1 个答案:

答案 0 :(得分:2)

您需要在基地中虚拟encryptdecrypt个功能:

class Cipher{
public:
    virtual string encrypt(string);
    virtual string decrypt(string);
};

这是因为他们在encrypt_withdecrypt_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);
}