verschlüsselung und entschlüsselung



  • ich hab ein programm geschrieben bei dem man mit cäsar code ver- und entschlüsseln können soll, ich hab nun weils mit cin nicht funktioniert hat geline(cin, variable) verwendet. Doch nun wird dieser schritt vom programm immer übersprungen. Hier der code.

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main()
    {
        char WH=0;
        do
        {          
    	char a, cAuswahl;
    	int b, iSchluessel;
    	string strNachricht("");
    	WH=0;
    
    	cout << "Was wollen Sie machen? \n" 
             << "(1) Verschluesseln      oder \n" <<
                "(2) Entschluesseln" << endl;
    
        cin >> cAuswahl;
    
                                     switch(cAuswahl)
                                     {
                                     case '1':
    
                                     // Eingabe des Schlüssels
                                     cout << "\nGeben Sie den zu verwendenden Schluessel ein: ";
                                     cin >> iSchluessel;
    
                                     //Eingabe der Nachricht
                                     cout << "\nGeben Sie den zu verschluesselnden Text ein: \n";
                                     getline( cin , strNachricht );
    
                                     //Verschlüsselung
                                     for(size_t i=0; i < strNachricht.size(); i++)
                                     {
                                                a = strNachricht[i];
                                                b = a;
                                                b = b + iSchluessel;
                                                a = b;
                                                strNachricht[i] = a;
                                     }
    
                                     // Ausgabe des verschlüsselten Textes
    
                                     cout << "Der verschluesselte Text lautet nun: \n"
                                          << strNachricht;
    
                                      break;
    
                                      case '2':
    
                                      // Eingabe des Schlüssels
                                     cout << "\nGeben Sie den  verwendeten Schluessel ein: ";
                                     cin >> iSchluessel;
    
                                     //Eingabe des verschlüsselten Textes
                                     cout << "\nGeben Sie den zu entschluesselnden Text ein: \n";
                                     getline( cin , strNachricht );
    
                                     //Entschlüsselung
                                     for(size_t i=0; i < strNachricht.size(); i++)
                                     {
                                                a = strNachricht[i];
                                                b = a;
                                                b = b - iSchluessel;
                                                a = b;
                                                strNachricht[i] = a;
                                     }
    
                                     // Ausgabe der tatsächlichen Nachricht
    
                                     cout << "Der entschluesselte Text lautet nun: \n"
                                          << strNachricht; 
    
                                     break;
    
                                     default:
                                             cout << "Waehlen Sie doch bitte (1) oder (2)!\n";
                                     break;
                                     }
    
            cout << "Wollen Sie das Programm erneut ausfuehren, so druecken Sie die (1)!!!";
            cin >> WH;
            }
            while(WH=='1');
    
    	system("PAUSE");
    	return 0;
    }
    


  • Vor getline musst du den Eingabestream leeren. Das geht hiermit:

    cin.seekg(0,std::ios::end);
    cin.clear();
    

    Das ganze in deinem Programm:

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    int main() {
        char WH = 0;
        do {
            char a, cAuswahl;
            int b, iSchluessel;
            string strNachricht("");
            WH = 0;
            cout << "Was wollen Sie machen? \n"
            << "(1) Verschluesseln      oder \n" <<
            "(2) Entschluesseln" << endl;
            cin >> cAuswahl;
            switch (cAuswahl) {
                case '1':
                    // Eingabe des Schlüssels
                    cout << "\nGeben Sie den zu verwendenden Schluessel ein: ";
                    cin >> iSchluessel;
    
                    //Eingabe der Nachricht
                    cout << "\nGeben Sie den zu verschluesselnden Text ein: \n";
                    std::cin.seekg(0,std::ios::end);
                    std::cin.clear();
                    getline( cin , strNachricht );
    
                    //Verschlüsselung
                    for (size_t i = 0; i < strNachricht.size(); i++) {
                        a = strNachricht[i];
                        b = a;
                        b = b + iSchluessel;
                        a = b;
                        strNachricht[i] = a;
                    }
    
                    // Ausgabe des verschlüsselten Textes
                    cout << "Der verschluesselte Text lautet nun: \n"
                    << strNachricht;
                    break;
                case '2':
    
                    // Eingabe des Schlüssels
                    cout << "\nGeben Sie den  verwendeten Schluessel ein: ";
                    cin >> iSchluessel;
    
                    //Eingabe des verschlüsselten Textes
                    cout << "\nGeben Sie den zu entschluesselnden Text ein: \n";
                    std::cin.clear();
                    getline( cin , strNachricht );
                    getline( cin , strNachricht );
    
                    //Entschlüsselung
                    for (size_t i = 0; i < strNachricht.size(); i++) {
                        a = strNachricht[i];
                        b = a;
                        b = b - iSchluessel;
                        a = b;
                        strNachricht[i] = a;
                    }
    
                    // Ausgabe der tatsächlichen Nachricht
                    cout << "Der entschluesselte Text lautet nun: \n"
                    << strNachricht;
                    break;
                default:
                    cout << "Waehlen Sie doch bitte (1) oder (2)!\n";
                    break;
            }
            cout << "Wollen Sie das Programm erneut ausfuehren, so druecken Sie die (1)!!!";
            cin >> WH;
        }
        while (WH == '1');
        system("PAUSE");
        return 0;
    }
    

    Weiter Informationen: http://www.cpp-tutor.de/cpp/le04/le04_02.htm

    mfg.



  • Hinsichtlich des Eingabestreams "leeren": Sowas ist quasi immer ein Fehler (und funktioniert oft nicht zuverlässig) und auf Nicht-Verständnis der Eingaberoutinen zurückzuführen.

    Das eigentliche Problem ist, dass ein "arithmetic extractor" (>>-Operator für eingebaute Datentypen) das nachfolgende '\n' nicht aus dem Stream entfernt. Beim mehrfachen Lesen mit >> ist es egal, da der Operator Whitespaces ignoriert per Default ('\n' zählt auch als Whitespace). Das getline dagegen stolpert nun aber über das '\n' und "denkt", es hätte erfolgreich eine Zeile gelesen. Du müsstest das '\n' mit einem cin.ignore ignorieren.



  • danke für eure hilfe, wir nahmen das in der schule durch und dort hatte ich einige kleinere probleme und jetzt schrieb ich das programm zuhause nochmal. Jetzt funktioniert´s ja. Jetzt macht das ganze aber nur sinn, wenn man den Text in einer Textdatei abspeichert, diese dann mit option 2 öffnen kann und dann wieder entschlüsseln. Jedoch sind wir noch nicht so weit im Stoff. Ich habe aber einmal etwas von ifstream und ofstream oder so gehört. Würde sich jemand der Sache annehmen und mir diese Befehle erklären? Schreiben tu ich dann selber. Danke



  • XaTrIxX schrieb:

    danke für eure hilfe, wir nahmen das in der schule durch und dort hatte ich einige kleinere probleme und jetzt schrieb ich das programm zuhause nochmal. Jetzt funktioniert´s ja. Jetzt macht das ganze aber nur sinn, wenn man den Text in einer Textdatei abspeichert, diese dann mit option 2 öffnen kann und dann wieder entschlüsseln. Jedoch sind wir noch nicht so weit im Stoff. Ich habe aber einmal etwas von ifstream und ofstream oder so gehört. Würde sich jemand der Sache annehmen und mir diese Befehle erklären? Schreiben tu ich dann selber. Danke

    Zu den fstreams gibt's massign Tutorials im inet. Einfach mal n bisschen googeln, dann findest z.B. http://web.dadanini.com:7980/books/C++ in 21 Tagen/kap16.html

    mfg.



  • von Taurin, woanders hier im Forum:

    Alles mit drum und dran. Hab aber bei der Eingabe geschummelt 🙂

    1 #include <fstream>
    2 int main (int argc, char *argv[]) {
    3     std::ifstream in(argv[1]);    // erstes Argument:  Eingabedatei
    4     std::ofstream out(argv[2]);   // zweites Argument: Ausgabedatei
    5     unsigned counter = 0;         // aktuelle Position im key-string (mod strlen)
    6     char     ch = 0;              // aktuelles Zeichen
    7     while(in.get(ch)) out.put(ch ^ (argv[3])[(counter++)%strlen(argv[3])]); 
    8 }
    

    Aufruf mit: Progarmmname <input> <output> <key>


Log in to reply