2016-03-27 15 views
-2

Ich muss Vigenere-Chiffre programmieren, aber meine Ausgabe sieht ein bisschen anders aus.Vigenere-Chiffre falsche Ausgabe

Eingang: Po Treti raz sa ohlasi Der Schlüssel: euhwa

Ausgang: TI ANEXC YWZ WU VDLEMP Was ich bekommen habe: TI ANEDM LHV SK SBSWSS

Könnten Sie bitte Hilf mir herauszufinden, warum funktioniert es nicht richtig?

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <ctype.h> 

char* vigenere_encrypt(const char* key, const char* text) 
{ 
    if(key==NULL || text==NULL) 
     return NULL; 

    int i,k,t,j=0; 
    t = strlen(text); 
    k = strlen(key); 

    char* copy=(char*)malloc(strlen(text)+1); 
    char* enc=(char*)malloc(strlen(text)+1); 
    char* copykey=(char*)malloc(strlen(key)+1); 

    for (i=0;i<k;i++) 
    { 
     copykey[i]=toupper(key[i]); 
    } 

    for (i=0;i<k;i++) 
    { 
     if(!(isalpha(copykey[i]))) 
     { 
      free(copy); 
      free(copykey); 
      free(enc); 
      return NULL; 
     } 
    } 

    for (i=0;i<=t;i++) 
    { 
     copy[i]=toupper(text[i]); 
    } 

    for (i=0;i<=t;i++) 
    { 
     if (isupper(copy[i])) 
     { 
      enc[i]=(copy[i]+copykey[j])%26+'A'; 
      j++; 
      if (j>k) 
       j=0; 
     } 
     else enc[i]=copy[i]; 
    } 

    free(copy); 
    free(copykey); 
    return enc; 
} 

int main() 
{ 
    char* encrypted; 
    encrypted = vigenere_encrypt("euhwa","Po treti raz sa ohlasi!"); 
    printf("%s\n",encrypted); 
    free(encrypted); 
} 
+2

Dieser Code ist bis jetzt schrecklich anzusehen. Wie ein allgemeiner Tipp, füge Abstand hinzu und versuche, keine Zeile wie folgt zu machen: 'für (i = 0; i <10; i ++)' sehe so aus: 'für (i = 1; <10; i ++)' . Warum machst du einige Dinge zwei oder mehrere Male? Sie laufen drei verschiedene Male von "i = 0" nach "t". Die ersten beiden machen genau das Gleiche. Je mehr Sie Ihre Logik aufräumen, desto einfacher wird es für Sie sein Problem zu debuggen. –

+0

Auch, weil Sie dies definitiv für CS50 (http://cs50.tv) tun, sollten Sie nicht erwarten, dass Menschen Ihnen die Antwort geben. Sie sollten uns wissen lassen, was Sie versucht haben und Sie sollten deutlich machen, dass dies eine Hausaufgabe ist. Auch: 'int i, k, t, j = 0;' macht wahrscheinlich nicht das, was Sie denken. Und dann iterieren Sie von i = 0 nach t, ​​was undefiniert ist! –

+0

TIPP: Versuchen Sie, einen 'printf' in die Cipher-Schleife einzufügen, damit Sie sehen können, welche' char' Sie als 'plaintext' und' key' verwenden, da ein offensichtliches Problem darin besteht, wie Sie den Schlüssel verwalten Code und fügte diese Zeile 'printf (" char:% c +% c mod26 + A:% c \ n ", kopieren [i], copeykey [j], enc [i]);') – FredMaggiowski

Antwort

0

Die Frage ist, wie Sie behandeln das:

"Hey, ich den Schlüssel beendet haben können j, bringen wieder auf Null"

Jetzt ist der Code, hübsch chaotisch, nicht für die doppelte Kopie/Paste (es kann passieren), aber weil es könnte (und sollte) ein wenig optimiert werden ..

Wie auch immer die Lösung für Ihr Problem ist einfach:

sollten Sie j auf 0 setzen, wenn j>= von k ist. Wichtig ist der equal Teil, da Sie möchten, dass es 0 ist, wenn Sie die Länge des Schlüssels erreichen. Die Art, wie Sie es tun (nur Testen für greater than) bedeutet, dass, wenn Sie das Ende des Schlüssels erreichen Sie eine zusätzliche Schleife, die einen ungültigen copykey Wert verwendet. Wenn der Schlüssel Länge gleich 5 ist, sollten Sie bei copykey[4] aber die extra Schleife tut copykey[5] die ungültig ist .. und (un) zum Glück ist es nicht segfault Sie zur Hölle.

for (i=0;i<=t;i++) 
{ 
    if (isupper(copy[i])) 
    { 
     enc[i]=(copy[i]+copykey[j])%26+'A'; 
     j++; 
     if (j >= k) 
      j=0; 
    } 
    else enc[i]=copy[i]; 
} 
+1

Vielen Dank! Ich schätze deine Hilfe sehr! Ich bin dankbar! – Kingusss12

+0

keine Sorge, es ist ein Vergnügen;) – FredMaggiowski