Verschluesselungsprogramm macht sich selbstständig



  • Hi, ich möchte ein Programm in C schreiben, welches mir einen eingegebenen klein bzw Großbuchtsaben mit der Funktion decrypt() erst verschluesselt und dann mit encrypt()entschluesselt. An den Rändern bzw bei 'w' und 'W' muss beachtet werden dass man wieder bei a beginnt. Der Buchstabe soll um 3 Stellen verschoben werden. Nun habe ich viel herumprobiert und habe das ganze mal ohne Funktion mal mit und in verschiedenen Variationen versucht.
    Wird ein Wert eingegeben, wird er bei Ausgabe mit printf natürlich noch angezeigt. Kommt aber die Funktion ins Spiel ändert sich der Wert auf '0'/00/ oder ähnlich (nach dem Debugger). Bei der Ausgabe steht dann nichts da. Zwischendurch als ich das ganze mal ohne Funktionen erstellt habe, hab ich manchmal einen Pfeil nach links bzw rechts ausgegeben bekommen obwohl ein a meine Eingabe war, mal habe ich ein C mit einem punkt unten bekommen und mal sogar den richtigen Buchstaben. Nun hab ich aber das ganze mit Funktion erstellt wie es auch gefordert ist und so funktioniert es leider nichtmal nur falsch sondern es wird einfach nichts angeteigt.
    Ich hoffe also jemand kann mal über den Code schauen, es ist nicht sehr viel.
    Vielen Dank.

    main:

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    
    /* 
     * File:   main.c
     * Author: Neuer Benutzer
     *
     * Created on 12. November 2017, 13:09
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include "infopr2a3.h"
    
    /*
     * 
     */
    int main(int argc, char** argv) {
    
        //Definition
        char buchstabe = 0;
        char buchstabeversch = 0;
        char buchstabeentsch = 0;
    
        //Abfrage des Buchstabens
        printf("Geben Sie einen Buchstaben ein: \n");
        fflush(stdin);
        scanf("%c", &buchstabe);
    
        //Verschluesselung
        buchstabeversch == decrypt(buchstabe);
    
        //Beachtung falls Eingabe groesser 'w' oder 'W'
        if (buchstabeversch > 'w' || buchstabeversch > 'W') {
            buchstabeversch == buchstabeversch - 26;
        }
        printf("Eingabe:%c Buchstabe verschluesselt:%c\n", buchstabe, buchstabeversch);
    
        //Entschluesselung
        buchstabeentsch == encrypt(buchstabeversch);
    
        //Beachtung dass entschluesselter buchstabe wieder der urpruengliche ist
        if (buchstabeentsch < 'd' || buchstabeentsch 'D') {
            buchstabeentsch == buchstabeentsch + 26;
        }
        //Ausgabe des entschluesselten Wertes
        printf("Der Buchstabe ist entschluesselt: %c", buchstabeentsch);
        return (EXIT_SUCCESS);
    }
    

    **
    source:**

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    
    char decrypt( char a){
        int i = 3;
        char z;
        return (z==a+i);
    }
    
    char encrypt(char b){
        int i=3;
        char z;
    
        return(z==b-i);
    }
    

    header

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    
    /* 
     * File:   infopr2a3.h
     * Author: Neuer Benutzer
     *
     * Created on 14. November 2017, 12:15
     */
    
    #ifndef INFOPR2A3_H
    #define INFOPR2A3_H
    #include "infopr2a3.h"
    
    #ifdef __cplusplus
    extern "C" {
    #endif
    
    //Prototyping Signatur Verschluesselung und entschluesselung;
        char decrypt(char);
        char encrypt(char);
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif /* INFOPR2A3_H */
    


  • //Beachtung falls Eingabe groesser 'w' oder 'W'
        if (buchstabeversch > 'w' || buchstabeversch > 'W') {
            buchstabeversch == buchstabeversch - 26;
        }
    

    Hast Du daran gedacht, dass ALLE Kleinbuchstaben größer als 'W' sind?
    Also diese Bedingung trifft auf alle Buchstaben von 'a' - 'z' und von 'X' - 'Z' zu!


  • Global Moderator

    Deine Logik ist falsch. Mal angenommen, die Buchstaben hätten diese Reihenfolge:
    ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz
    Wenn du nun den Buchstaben 'f' um 3 verschiebst, kommt 'i' heraus. Aber was passiert nun bei einer Abfrage wie

    if (buchstabeversch > 'w' || buchstabeversch > 'W')
    

    ? 'i' ist zwar kleiner als 'w', aber größer als 'W'! Das ist nicht das, was du wolltest. Ebenso bei anderen Abfragen dieser Art.

    Tipp zur Struktur deines Programms:
    Eine Funktion sollte genau eine Sache tun und die dann auch richtig. Dadurch, dass du die Nachbehandlung des decrypt-Ergebnisses aus der Funktion decrypt herausgezogen hast, hast du nun in der gesamten Programmlogik Teile des decrypten verteilt (und ebenso encrypt). Wie viele Stellen im Programm müsstest du ändern, wenn du statt 3 um 7 verschieben möchtest? Ich zähle mindestens 4. Das sollte nur eine Stelle sein. Deine encrpyt und decrypt Funktion sollte so geschrieben sein, dass sie gleich das korrekte, vollständige Ergebnis zurück geben.

    Idealerweise gestaltest du es auch noch so, dass man den Funktionen die Verschiebung mitgeben kann, anstatt dass sie fest im Programm steht. Vielleicht fällt dir dann auch die Formulierung einer besseren if-Bedingung für das obige Problem leichter.



  • Zeile 38,47 und 10,17 machen nicht das was du beabsichtigst.



  • ok dann klappt das so nicht und ich werde es bearbeiten. Nur ist das Problem nicht dass die falschen Zeichen ausgegeben werden sondern dass nichts ausgegeben wird. Selbst wenn hier jetzt ein völlig anderes Zeichen ausgegeben werden würde müsste es ja trotzdem ausgegeben werden aber es wird eben nichts ausgegeben!



  • normalerweise macht man diese verschlüsselung auch mit dem modulo-operator (%) und "verschlüsseln" bedeutet "encrypt", nicht umgekehrt.


  • Global Moderator

    magamasta schrieb:

    ok dann klappt das so nicht und ich werde es bearbeiten. Nur ist das Problem nicht dass die falschen Zeichen ausgegeben werden sondern dass nichts ausgegeben wird. Selbst wenn hier jetzt ein völlig anderes Zeichen ausgegeben werden würde müsste es ja trotzdem ausgegeben werden aber es wird eben nichts ausgegeben!

    Wenn gar nichts ausgegeben wird dann mach mal die Zeile 30 raus. Die ist nicht nur unnötig und falsch, es ist sogar undefiniertes Verhalten fflush aus einem Ausgabestream anzuwenden. Die Konsole völlig zu zerschießen ist ein typischer Nebeneffekt der daraus resultieren kann.

    Damit solltest du auf jeden Fall irgendeine Ausgabe erhalten. Ob falsch oder richtig hängt davon ab, ob du den restlichen Hinweisen (Achte unbedingt auch auf Wutzs Hinweise!) gefolgt bist.



  • so nun einige aenderungen. Das erste fflush habe ich zum test mal raus genommen. Bin nun auch nochmal mit dem Debugger rüber. Die Variable der Eingabe geht wie sie soll auf 65 für 'A'.

    main:

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    
    /* 
     * File:   main.c
     * Author: Neuer Benutzer
     *
     * Created on 12. November 2017, 13:09
     */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include "infopr2a3.h"
    
    /*
     * 
     */
    int main(int argc, char** argv) {
    
        //Definition
        char buchstabe = 0;
        char buchstabeversch = 0;
        char buchstabeentsch = 0;
    
        //Abfrage des Buchstabens
        printf("Geben Sie einen Buchstaben ein: \n");  //FFlush zum test raus
        scanf("%c", &buchstabe);
    
        //Verschluesselung
        buchstabeversch == encrypt(buchstabe);
    
        printf("Eingabe:%c Buchstabe verschluesselt:%c\n", buchstabe, buchstabeversch);
    
        //Entschluesselung
        buchstabeentsch == decrypt(buchstabeversch);
    
        //Ausgabe des entschluesselten Wertes
        printf("Der Buchstabe ist entschluesselt: %c", buchstabeentsch);
    
        return (EXIT_SUCCESS);
    
    }
    

    Sobald ich zur ersten Funktion komme (Encrypt nun auch geändert) zeigt er mir bei den Variablen wieder das 0/000/ oder so an also wie wenn sie gar nicht erst beschrieben werden würden. Die Bedingungen mit if grösser als W und so hab ich jetzt zwar immer noch etwas unsinnig aber eigentlich sollten sie so funktionieren? Das mit return z == a+í ist auch verändert wobei ich nicht verstehe warum dass so nicht geht. Ich denke mal der Fehler muss bei der Variablenbezeichnung liegen oder dass ich den falschen Datentyp genommen habe. Wie ich es verstanden habe kann ich aber doch auf ein char wie z.B. '65' ein int von z.B. i=3 addieren und komme so auf '68' bzw D oder? auf jeden Fall muss der Fehler in der Funktion liegen.

    source:

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    
    char encrypt(char a) {
        int i = 3;
        char z;
        if (a > 'W' && a <= 'Z') { //Ueberpruefung ob Z ueberschritten wird
            z == a - 26 + i; //Handlung wenn es ueberschritten werden wuerde
        } else if (a > 'w' && a <= 'z') { //Ueberpruefung fuer kleinbuchst.
            z == a - 26 + i; //Handlung wenn es ueberschritten werden wuerde
        }
    
        z == a + i; //Handlung allgemein
        return (z);
    }
    
    char decrypt(char b) {
        int i = 3;
        char z;
        if (b <= 'D' && b >= 'A') {
            z == b + 26 - i;
        } else if (b <= 'd' && b >= 'a') {
            z == b + 26 - i;
        }
    
        z == b - i;
    
        return (z);
    }
    

    Die Header ist unverändert. Wäre nett wenn sich jemand nochmal die Funktion anschauen könnte. Vielen Dank.



  • also:
    "==" bedeutet "vergleiche die variable auf der linken seite mit der variable auf der rechten seite"
    "=" bedeutet "weise der variablen auf der linken seite den wert der variablen auf der rechten seite zu"

    du machst da also was falsch.



  • Wade1234 schrieb:

    "==" bedeutet "vergleiche die variable auf der linken seite mit der variable auf der rechten seite

    auf Gleichheit. Wenn Ja, ergibt das 1, sonst 0.

    magamasta schrieb:

    Wie ich es verstanden habe kann ich aber doch auf ein char wie z.B. '65' ein int von z.B. i=3 addieren und komme so auf '68' bzw D oder?

    Zeichen werden in C zwischen einfache Hochkomma gesetzt. Zahlenwerte nicht.
    Darum: 'D' entspricht 68 (im ASCII)
    Und es ist eigentlich egal ob du 'D' oder 68 schreibst. 'D' ist meist lesbarer und funktioniert oft auch bei nicht-ASCII.

    magamasta schrieb:

    Das mit return z == a+í

    Zum == siehe Wade1234
    Aber warum noch eine extra Variable z dafür? return a+i; reicht völlig



  • DirkB schrieb:

    Aber warum noch eine extra Variable z dafür? return a+i; reicht völlig

    das ist das EVA-prinzip, eigentlich ja sehr vorbildlich.



  • ohje ja na klar dass == war der Fehler. Vielen Dank leute hab noch ein paar kleine änderungen gemacht jetzt funktioniert es auch für alle Werte. 🙂