Problem mit Codierung/Decodierung



  • Hallo Leute!
    Ich habe die Aufgabe eine Codierung - Decodierung (Cäsar Methode) zu schreiben und ich komm auf keinen vernünftigen Ansatz!
    Bitte um Hilfe!

    #include <stdio.h>
    #include <stdlib.h>
    // Needed for invocation of function strlen to compute length of a string
    #include <string.h>
    // Encodes an ASCII-message of a specific length by adding shift
    #include <conio.h>
    #include <ctype.h>
    
    char *encode(char *message, int shift, int length) {
    
    // IMPLEMENT ENCODE HERE!
    }
    // Decodes an ASCII-message of a specific length by subtracting shift
    
    char *decode(char *message, int shift, int *length) {
    // IMPLEMENT DECODE HERE!
    
    int main(void) {
        char input[2][100];
    // CHANGE shift here until you get a meaningful decoded message
        int shift = 1;
    // Write encoded message into variable input[0]
        sprintf(input[0],"Kpl']hyphisl'j'pu'H|mnhil'8'oh{'klu'^ly{'<(");
    // Decode message with shift
        decode(input[0],shift,strlen(input[0]));
        printf("%s\n", input[0]);
    // Encode message
        sprintf(input[1],"Informatik ist cool!");
        encode(input[1],shift,strlen(input[1]));
        printf("%s\n",input[1]);
    // Check reversibility of encode and decode functions
        printf("%s\n", encode(input[0],shift,strlen(input[0])));
        printf("%s\n", decode(input[1],shift,strlen(input[1])));
        return EXIT_SUCCESS;
    }
    


  • Hallo,

    lies dir nochmal die Sache mit den Arrays und Strings durch.
    Wie man auf ein Array zugreift zeigst du ja bei deinem input.
    Ein String ist ein Array. Das Ende vom String wird mit dem Wert 0 gekennzeichnet.
    Du kannst auch jedes Zeichen als Ganzzahlwert auffassen.

    Deine encode und decode Funktionen wissen nicht wo sie die Daten hinschreiben sollen. Außerdem können sie die Länge selber feststellen.

    Ich würde sie so ähnlich wie strncpy machen. Statt der Länge den Shift angeben.

    char *caeser(char *code, char *org, int shift) {
    // codiere den Inhalt von org nach code
    // indem jeder Buchstabe durch einen anderen ersetzt wird,
    // der im Alphabet um shift Positionen versetzt ist.
    
      return code;
    }
    

    PS: Wenn shift negativ sein darf, kannst du auch gleich decodieren 😃
    PPS: In der Codierfunktion darf zu Testzwecken durchaus printf stehen.



  • Hi, ist das die Aufgabe also habt ihr diesen Quelltext bekommen?
    Weil dieser Funktionsprototyp gefällt mir irgendwie nicht..

    char *encode(char *message, int shift, int length);
    

    Da length übergeben wird, und char* zurückgegeben wird, müsste man hier also Speicher aus dem Heap anfordern. Diesen müsste man aber vor verlassen der Funktion auch wieder freigeben wenn diese mehr oder weniger praktisch sein soll. Gibt man den Speicher aber wieder frei zeigt der Rückgabewert ins Nirwana und somit ist diese Funktion für die Tonne 😃

    Stoppt mich wenn ich was dummes sage, aber das sieht alles nicht sonderlich professionell aus.. was spricht gegen das übergeben von einem Zeiger auf einen freien Puffer? Ich denke das wäre hier wesentlich angenehmer.



  • Ich glaub ich bin zu blöd für den scheiß!

    Ich weiß genau was ich machen soll, aber wie sag ich das mit einem array?
    Kann mir das hier jemand auflösen, damit das ding codiert und decodiert.....



  • cooky451 schrieb:

    Hi, ist das die Aufgabe also habt ihr diesen Quelltext bekommen?
    Weil dieser Funktionsprototyp gefällt mir irgendwie nicht..

    char *encode(char *message, int shift, int length);
    

    Da length übergeben wird, und char* zurückgegeben wird, müsste man hier also Speicher aus dem Heap anfordern. Diesen müsste man aber vor verlassen der Funktion auch wieder freigeben wenn diese mehr oder weniger praktisch sein soll. Gibt man den Speicher aber wieder frei zeigt der Rückgabewert ins Nirwana und somit ist diese Funktion für die Tonne 😃

    Stoppt mich wenn ich was dummes sage, aber das sieht alles nicht sonderlich professionell aus.. was spricht gegen das übergeben von einem Zeiger auf einen freien Puffer? Ich denke das wäre hier wesentlich angenehmer.

    Ja dieser quelltext ist die vorgabe - ich soll ihn nur vervollständigen.....wie gesagt hab aber keinen plan mehr!
    Wir sollen den vorgegebenen Text aus dem array auslesen und dann dekodieren in dem wir ihn durch eine schleife laufen lassen und von jedem char einen wert abziehen.....aber wie implementiert man das hier vernünftig?



  • Poste doch mal eine Schleife von 0 bis kleiner length.



  • int i; //Laufvariable
    for (i=0; i<lenght; i++){
    
    }
    


  • int i; //Laufvariable
    for (i=0; i<lenght; i++){
      *(message+i) += shift; // encode, bei decode -=
    }
    


  • Das ist jetzt mal der fertige Code...
    Der compiler zeigt 0 errors 0 warnings - trotzdem schmiert das Programm ab - bitte um Hilfe bei der Fehlersuche....

    #include <stdio.h>
    #include <stdlib.h>
    
    // Needed for invocation of function strlen to compute length of a string
    #include <string.h>
    
    // Encodes an ASCII-message of a specific length by adding shift
    char *encode(char *message, int shift, int length) {
        int i; //Laufvariable
    for (i=0; i<length; i++){
      *(message+i) += shift; // encode, bei decode -=
    }
    	// IMPLEMENT ENCODE HERE!
    }
    
    // Decodes an ASCII-message of a specific length by subtracting shift
    char *decode(char *message, int shift, int length) {
    	int i; //Laufvariable
    for (i=0; i<length; i++){
      *(message+i) -= shift; // encode, bei decode -=
    }
    	// IMPLEMENT DECODE HERE!
    }
    
    int main(void) {
    	char input[2][100];
    
    	// CHANGE shift here until you get a meaningful decoded message
    	int shift = 4;
    
    	// Write encoded message into variable input[0]
    	sprintf(input[0], "Kpl']hyphisl'j'pu'H|mnhil'8'oh{'klu'^ly{'<(");
    
    	// Decode message with shift
    	decode(input[0], shift, strlen(input[0]));
    	printf("%s\n", input[0]);
    
    	// Encode message
    	sprintf(input[1], "Informatik ist cool!");
    	encode(input[1], shift, strlen(input[1]));
    	printf("%s\n", input[1]);
    
    	// Check reversibility of encode and decode functions
    	printf("%s\n", encode(input[0], shift, strlen(input[0])));
    	printf("%s\n", decode(input[1], shift, strlen(input[1])));
    
    	return EXIT_SUCCESS;
    }
    


  • Eine Warnung das deine Funktionen einen Rückgabewert definiert haben aber keinen Wert zurückgeben sollte aber schon kommen.
    Sonst mußt du den Warn-Level ändern!
    Es fehlt ein

    return message
    

    in den Funktionen



  • Ich Trottel......ist ja klar das es dann nicht geht!
    Wäre ja echt nett von der Funktion wenn sie nicht im Nirvana verschwindet!
    Danke an alle die geholfen haben! Jetzt funzt das Teil!

    Meine Verzweiflung über die Informatik ist schon wieder ein klein wenig keiner geworden!


Log in to reply