VIGENERE Verschlüsselung: char-Array auslesen



  • Hallo,

    ich habe ein Problem beim Auslesen eines char-Arrays!
    Zuerst mal der Code (alles noch in main und nur ein Test 😉 )

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    int main() {
    
        char key[100];
        char plain[100];
        char code[100];
    
        printf("Geben Sie Ihren Schluesseltext ein: ");
        fgets(key, sizeof(key), stdin);
    
        printf("Geben Sie Ihren Klartext ein: ");
        fflush(stdin);
        fgets(plain, sizeof(plain), stdin);
    
        int p_len;
        int k_len;
        p_len = strlen(plain) - 1;
        k_len = strlen(key) - 1;
    
        int i;
        int k;
    
        i = 0;
        k = 0;
    
        printf("Laenge: %d\n", p_len);
    
        for(i = 0, k = 0; i <= p_len - 1; ++i, ++k) {
            if(k > k_len){ k = 0;}
    
            printf("k = %d\n", k);
            printf("i = %d\n", i);
    
        int column = (int)plain[i] - 65;
        int row    = (int)key[k] - 65;
        code[i] = (char)((column + row) % 26 + 65);
    
        fflush(stdin);
        printf("Code: %d\n", code[i]);
    
    }
        printf("%s\n", code);
        return(0);
    
    }
    

    Die printf's sind nur Testausgaben. Wenn ich aber beim letzten printf das code-array anschaue, dann werden die richtigen Zeichen ausgegeben, ALLERDINGS hört er dann nicht auf, sondern ich bekomme noch zig Zeichen nachgeliefert.

    Ich verstehe nicht warum! Kann mir jemand helfen?

    Danke!



  • 1. C-Buch kaufen
    2. durchlesen
    3. nochmal durchlesen

    dann machst du von alleine ein

    code[i] = 0;
    

    nach der for Schleife, dund weißt auch warum.



  • C-Buch ist schon daheim, allerdings bin ich erst bei den Grundlagen, und die Aufgabenstellung geht darüber hinaus!

    Jetzt funktioniert es, wunderbar!

    Vielen Dank!!!



  • Du weißt jetzt das ans Ende vom String eine 0 gehört.
    Darum:

    - Überleg mal ob die Anzahl bei fgets so in Ordnung ist.
    - Warum das bei dir strlen()-1heißt.
    - Statt - 65 darfst du auch - 'A' schreiben.



  • Das versteh ich auch nicht!;)
    Also warum ich bei p_len in der for-Schleife noch 1 abziehen muss.
    Ein String Array hat als letzte Stelle die '\0', um zu kennzeichnen dass der String zu Ende ist.

    Ah, jetzt kommt so langsam. Warum reicht es wenn ich dann code[i] = 0 schreibe und nicht '\0' ?

    Vielen vielen Dank für die gute Hilfe!!



  • iRufus schrieb:

    Das versteh ich auch nicht!;)
    Also warum ich bei p_len in der for-Schleife noch 1 abziehen muss.

    Das weiß ich auch nicht. Der Algorithmus ist nicht von mir.

    iRufus schrieb:

    Ein String Array hat als letzte Stelle die '\0', um zu kennzeichnen dass der String zu Ende ist.

    Ah, jetzt kommt so langsam. Warum reicht es wenn ich dann code[i] = 0 schreibe und nicht '\0' ?

    Weil es das selbe ist. Nur schreibt man gerne '\0' damit klar ist, das es sich um das Endezeichen handelt. Mit '\ooo' kannst du Oktalzahlen eingeben und \0 ist 0.

    iRufus schrieb:

    Vielen vielen Dank für die gute Hilfe!!

    Noch ein Hinweise der String "AB" hat die Länge 2, belegt aber 3 Speicherstellen.
    'A', 'B', '\0'
    strlen gibt die Länge zurück und in der for-Schleife kannst du auch i < p_len schreiben.



  • Also das Ergebnis ist aber immernoch falsch an den Stellen U-Z im Schlüssel. Keine Ahnung an was das liegt.



  • Nochmal der Gast von Oben. Es sind auch sonst die Werte falsch. Habs natürlich nicht mit allen probiert, aber bei allen die ich probiert hab stimmts nicht. Oder kann das Vigenère-Quadrat auch anders aussehen als mit A in der linken oberen Ecke?



  • Wie sieht den dein Programm aus.
    Das hier im ersten Post ist ja nicht richtig.



  • Hallo, der gast nochmal. Programm gibt jetzt richtige werte aus, aber auch noch nen paar zeichen extra. blöd.

    #include <stdio.h>
    
    int main() {
    
        char key[100],plain[100],code[100];
        int i=0, k=0, p_len, k_len;
    
        printf("Geben Sie Ihren Klartext ein: ");
        fgets(plain, sizeof(plain)-1, stdin);
    
        printf("Geben Sie Ihren Schluesseltext ein: ");
        fgets(key, sizeof(key)-1, stdin);
    
        p_len = strlen(plain)-1;
        k_len = strlen(key)-1;
    
        for(i=k=0; i<=p_len-1; ++i, ++k){
            if(k>k_len){k=0;}
            code[i]=0;
    
        int column=(int)plain[i]-'A';
        int row   =(int)key[k]-'A'-6;
        code[i]=(char)((column+row)%26+65);
    
    }
        printf("%s\n", code);
        getch();
    }
    

    is ja noch nen tag zeit.



  • Ich habe mal ein paar Kommentare reingemacht.

    Beantworte mal die Fragen darin.
    Wenn du die Antwort weißt, ändere den Code.
    Wenn du die Antwort nicht weißt, frag nochmal.

    Gast_again schrieb:

    #include <stdio.h>
    
    int main() {
    
        char key[100],plain[100],code[100];
        int i=0, k=0, p_len, k_len;
    
        printf("Geben Sie Ihren Klartext ein: ");
        fgets(plain, sizeof(plain)-1, stdin);
    
        printf("Geben Sie Ihren Schluesseltext ein: ");
        fgets(key, sizeof(key)-1, stdin);
    
        p_len = strlen(plain)-1;  // Warum -1? 
        k_len = strlen(key)-1;    // dito
    
        for(i=k=0; i<=p_len-1; ++i, ++k) {     // aus i<=p_len-1; mach i<p_len;
            if(k>k_len)
            { k=0; }
            code[i]=0;                         // Hier wird eine 0 eingesetzt!
    
           int column=(int)plain[i]-'A';
           int row   =(int)key[k]-'A'-6;       // =(int)key[i%k]-'A'-6; Warum -6?
           code[i]=(char)((column+row)%26+65); // Hier wird die 0 wieder überschrieben
    
        }
        code[i]=0;  // NEU
     
        printf("%s\n", code);
        getch();
    }
    

Log in to reply