2015-04-26 2 views
0

Это криптографическая программа, которая предположительно t шифрует и расшифровывает сообщение с использованием шифрования rot13. Когда я запускаю программу, она выплевывает кучу бессмыслицы, а затем говорит мне, что программа «перестала работать».Программа C++ не будет работать правильно

#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; 
} 
+3

Пожалуйста, прочтите [Как отлаживать небольшие программы] (http://ericlippert.com/2014/03/05 /, как в отладке-маленьких-программы /). – honk

ответ

2

Вам нужно сделать encrypt и decrypt функции виртуальной в базе:

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

Это происходит потому, что они называются на базовом классе в encrypt_with и decrypt_with и поэтому базовые функции вызываются поскольку они не помечены как виртуальные. Я также рекомендую сделать их абстрактно, как «шифрование и дешифрование на экземпляре базы Cipher на самом деле не имеет смысла:

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

Кстати, с помощью отладчика бы я нашел это очень быстро - я бы рекомендуем ознакомиться с отладчиком, на котором установлены ваши инструменты, поскольку его незаменимым навыком является

Theres другая проблема в коде, который этот поиск не возвращает ничего, если персонаж не был найден, поэтому у вас будет мусор , Вы либо захотите проверить ошибку (выведите исключение, возможно?), Либо верните известное значение.

EDIT: Кроме того, как отметил Leiaz наш encrypt_with и decrypt_with должны возвращать значения из их вызова шифровальщика объекта:

string encrypt_with(Cipher *cipher, string text) { 
    return cipher->encrypt(text); 
} 

string decrypt_with(Cipher *cipher, string text) { 
    return cipher->decrypt(text); 
} 
+2

Большая проблема - это функции, которые должны возвращать строку, не возвращают ничего. – Leiaz

+0

@Leiaz Таким образом, возвращаемый мусор. – Carcigenicate