Vigenère Algorithmus funktioniert nicht richtig.



  • Hey Leute,
    Mein Ziel ist es, ein Programm zu schreiben,
    dass mit dem Vigenère Algorithmus verschlüssen und
    entschlüsseln kann. Nun scheitere ich aber schon beim Entschlüsseln.
    Hier der bisherige Code:

    char *key = new char[100];
    char *word = new char[100];
    char *result = new char[100];
    
    int length(char *c){
    	int i = 0;
    	while(*(c+i)!='\0')i++;
    	return i;
    }
    
    void encode(){
    	int keyarr[length(key)];
    	for(int i = 0; i<length(key); i++)keyarr[i]=(int)*(key+i)-65;
    	int count = 0;
    	for(int x = 0; x<length(word); x++){
    		*(result+x)=(char)((int)*(word+x)-65+keyarr[count])%26+65;
    		if(count = length(key)-1) count = 0;
    		else count++;
    	}
    	return;
    }
    

    Es wird immer nur der erste Buchstabe entschlüsselt... der Aufruf der Funktion
    encode() erfolgt auch erst nachdem key und word werte zugewiesen worden sind. Ich habe echt alles versucht, wäre cool wenn mir hier jemand weiterhelfen könnte! Danke schonmal!



  • Zeile 17 erscheint mir fehlerhaft. Sollte eigentlich auch Dein Compiler mit einer Warnung belegen. Wenn er das nicht getan hat, schau in der Bedienungsanleitung Deines Compilers nach, wie Du diese aktivieren kannst.

    Gnu-C(++) -Wall
    Visual Studio /W3 (Eigenschaftenseite -> C++ -> Allgemein -> Warnstufe)

    Tip: C++ und die meisten anderen Programmiersprachen unterscheiden zwischen Zuweisung und einem Vergleich.

    mfg Martin



  • Noch ein paar Tips:

    statt length, kannst Du auch die Standardfunktion strlen benutzen.

    Das ganze dann auch nioch in einer Schleifenbedingung aufzurufen ist Unfug, zumindest, wenn sich der String nicht ändert. Kostet zuviel Zeit.

    mfg Martin



  • Danke man, hab das total übersehen!
    Von strlen wusst ich gar nix... Naja gut zu wissen,
    Problem ist gelöst, geht jetz!


  • Mod

    WzzP schrieb:

    Danke man, hab das total übersehen!
    Von strlen wusst ich gar nix... Naja gut zu wissen,
    Problem ist gelöst, geht jetz!

    Um mal so zu sagen: Du weisst von einer ganzen Reihe von Dingen nichts, die dein Programm erheblich vereinfachen wuerden. strlen ist hier sogar nur eine Kruecke aus laengst vergangenen C-Zeiten, die dir deine manuelle Zeichenkettenbehandlung etwas einfacher macht. Mit der Art und Weise, wie man Zeichenketten in C++ eigentlich behandelt, haben weder strlen noch dein Code irgendwas zu tun.

    So koennte das in (prozeduralem) C++ aussehen (eben fix im Editor programmiert, ungetestet)

    string encode(const string& plaintext, const string& key)
    {
      string result;
      for(size_t i = 0; i < plaintext.size(); ++i)
      {
        result.push_back((plaintext[i] + key[i % key.length()]) % 26 + 'A'); // Ueber die Details der Verschluesselung kann man hier noch verhandeln.
                                                                             // Ich habe mal ein paar weniger 'A's abgezogen als du.
      }
      return result;
    }
    

    Das ist auch keine Zauberei fuer Fortgeschrittene, sondern wie man als blutiger Anfaenger Zeichenketten in C++ lernen sollte. Du solltest hochgradig skeptisch gegenueber dem Lehrmaterial sein, dass dir ernsthaft new fuer Arrays beigebracht hat (ein nacktes new kommt in C++ so gut wie nie vor!); dir nullterminierte char-Arrays zur Zeichenkettenbehandlung vorschlaegt; dabei die C-Funktionen zur Behandlung von nullterminierten char-Arrays unterschlaegt; std::string nicht erwaehnt; und globale Variablen zur Parameteruebergabe an Funktionen vormacht. Jeder einzelne dieser Punkte ist eine kleine Todsuende in C++, wo immer du das her hast, macht sie alle! Und wahrscheinlich noch viele weitere. Daher solltest du sich schleunigst von diesem Lehrmaterial trennen und dir was vernuenftiges suchen. Guck zum Beispiel in meiner Signatur fuer Buchtipps.


Anmelden zum Antworten