String verschlüsseln



  • Aufgabe sieht wie folgt aus:

    Schreiben sie ein C++ Programm, das einen String verschlüsselt indem es benachbarte Zeichen miteinander vertauscht, also das 1. mit dem 2. Zeichen , das 3. mit dem 4. usw....
    Sie müssen prüfen ob der eingegebene String aus einer geraden Anzahl von Zeichen besteht. Falls nicht, muss der String erneut eingelesen werden. Siehe Testlauf...

    Testlauf:
    String=? >> GIP
    String=? >> Informatik
    Codiert; >> nIofrtaki

    **********************************

    #include <iostream>
    #include <string>
    using namespace std;

    int main ()
    {
    int l;
    string s;
    char c;

    do
    {
    cout << "String = ?";
    cin >> s; // String einlesen
    l = (int)s.length(); // Länge des Strings
    }while (l%2) // ist der String gerade?!

    for (int i=0; i<l; i=i+2) //Schleife so lange i kleiner Länge ist
    // verschiebung von i um 2 ... +2 halt

    {
    c=s[i] //c bekommt das zeichen von i zugewiesen
    s[i] = s[i+l]; // das Zeichen i bekommt i+Länge zugewiesen (WIESO???)
    s[i+l] = c; //?!?!?!?!?!?!?

    }

    cout << "codiert: " << s << endl << endl;
    return 0;
    }

    Verstehe die letzte Schleife nicht so ganz... kann sie mir wer in Worten ausdrücken?!

    Wäre super!
    Danke



  • 1. Das hier ist das C++/CLI Forum, Du bist also falsch hier!
    2. Benutze die Code Tags (bzw. die C/C++) um deinen Code zu formatieren

    Hoffentlich verschiebt dich ein Mod. bald...

    Simon



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Das ist halt der Nachteil wenn man mit Variablen wie i, I, l, L, 1 und so weiter arbeitet. Da fällt die Unterscheidung schnell mal schwer. 😃

    Wobei es ja auch Leute gibt die mit verschachtelten Zählvariablen der Art I, II, III, IV, V, VI, VII usw arbeiten...



  • Um Fellhuhns Aussage etwas zu präzisieren.

    misthase83 schrieb:

    for (int i=0; i<l; i=i+2) // Das l ist ein kleines L
    {
        c=s[i]  
        s[i] = s[i+l];  // das 1 ist eine Eins
        s[i+l] = c;     // das 1 ist eine Eins
    }
    

    Abhilfe aus solchen Dilemmas: sprechende Variablen verwenden. Statt dem kleinen L z.B. laenge oder length ...



  • Naja, hab es mal für dich anders formatiert und sinnvollere Variablennamen vergeben 😉

    #include <iostream>
    #include <string>
    
    int main ()
    {
    	using namespace std;
    
    	string userInput;
    	size_t strLength;
    	do
    	{
    		cout << "String = ?";
    		cin >> userInput;
    
    		strLength = userInput.length();
    	} while(strLength%2)
    
    	char charbuff;
    	for(string::size_type curChar = 0; curChar < strLength; curChar += 2)
    	{
    		charbuff				= userInput[curChar];
    		userInput[curChar]		= userInput[curChar + l];
    		userInput[curChar + l]	= charbuff;
    	}
    
    	cout << "codiert: " << userInput << endl << endl;
    	return 0;
    }
    


  • Das ist eine Frage zur Verschlüsselung allgemein. Hierfür gibt es ausgefeilte Möglichkeiten (mit fremden Programmen). Will man das selbst machen, ist der Ansatz schon brauchbar. Noch etwas besser wäre es, den gesamten Zeichensatz von ASCII zum Austausch zu verwenden. Bedenke dabei aber bitte: Jeder halbwegs clevere Geheimdienst knackt das in kürzester Zeit. Ich habe das mal für einen Kunden gemacht und zusätzlich einen Haufen Schrott hineingeschrieben. Der Kunde ist zu einem Freund vom Geheimdienst gegangen und dieser konnte die Verschlüsselung innerhalb weniger Minuten knacken. Sein Kommentar: etwas ungewöhnlich, aber einfach!



  • Äh, das geht hier wohl eher um eine Aufgabe aus dem Studium und nicht um ernsthafte Verschlüsselung. Da ist die eher absolut lachhaft und nicht einmal als Verschlüsselung anzuerkennen.



  • HurgaHurga schrieb:

    Um Fellhuhns Aussage etwas zu präzisieren.

    misthase83 schrieb:

    for (int i=0; i<l; i=i+2) // Das l ist ein kleines L
    {
        c=s[i]  
        s[i] = s[i+l];  // das 1 ist eine Eins
        s[i+l] = c;     // das 1 ist eine Eins
    }
    

    Abhilfe aus solchen Dilemmas: sprechende Variablen verwenden. Statt dem kleinen L z.B. laenge oder length ...

    Ja, dass es sich da um Einsen handelt ist mir klar...
    Doch was passiert da genau und wieso?!
    c wird = dem zeichen(i) im feld s gesetzt...
    das wird dann nochma i+1 gemacht...
    und das wieder = c ....

    ?!?!?! checks net ganz



  • Wenn du zwei Variablen vertauschen willst brauchst du eine temporäre Variable (in diesem Fall c) um den Tausch vornehmen zu können.

    Angenommen die Schleife sei im Moment bei i=2

    c=s[2]  // du merkst dir den Wert von s[2], weil er in der nächsten Zeile per Zuweisung überschrieben wird
    s[2] = s[3];  // hättest du dir s[2] vorher nicht gemerkt wäre der Wert nach dieser Zeile verschwunden
    s[3] = c;
    

    Jetzt ist der Wert von s[2] in s[3] abgelegt und umgekehrt. Es wurden, wie in der Aufgabe verlangt, zwei benachbarte Felder s[i] und s[i+1] vertauscht. Nichts weiter.



  • c=s[i] // in c wird der wert von s[i] zwischengespeichert. 
    s[i] = s[i+l]; // s[i] erhält den Wert von s[i+1], also eine Stelle nach s[i]
    s[i+l] = c; // die Stelle nach s[i] (der aktuellen Stelle) erhält den Wert von c, also dem ehemaligen s[i].
    

    Somit wird die aktuelle Stelle mit der nächsten Stelle vertauscht.

    for (int i=0; i<l; i=i+2)
    

    Nach dem vertauschen der ersten (i = 0) mit der zweiten (i + 1 = 1) wird die dritte die "aktuelle" Stelle, also s[2]. Diese wird mit der vierten s[2+1] vertauscht. Dies geht so weiter bis zum Abbruch der Schleife, also wenn i größer als die Länge des Strings ist.

    Entschuldigung, ich habe zu langsam getippt...



  • Ach so, vielleicht hapert es bei dir in Sachen Array, String usw. ...

    Wenn du, wie in deinem Beispiel, eine Varialbe vom Typ std::string hast, dann kannst du über den Indexoperator auf die einzelnen Zeichen zugreifen.

    Also, z.B.:

    string s = "Hallo";
    
    s[0] wäre dann 'H'
    s[1] wäre 'a'
    s[2] wäre 'l'
    // ...
    

    @Adam
    Doppelt hält besser 😃 😃 😃



  • Fellhuhn schrieb:

    Äh, das geht hier wohl eher um eine Aufgabe aus dem Studium und nicht um ernsthafte Verschlüsselung. Da ist die eher absolut lachhaft und nicht einmal als Verschlüsselung anzuerkennen.

    Ja, die Zeiten der 'Zwiebelschrift' und von 'Enigma' sind wohl vorbei. Aber lasst ihn doch nachdenken und etwas finden. Für nicht professionelle Entschlüssler kann es allemal reichen!


Anmelden zum Antworten