Caesar Verschlüsselung. Allgemeine Verschlüsselung.



  • Motors-Freak schrieb:

    Mein Problem ist jetzt, dass ich noch sogut wie gar keine Grundlagen über Strings habe.

    Dann ist genau jetzt der Zeitpunkt sich diese Grundlagen anzueignen. Denn dafür ist diese Aufgabe gemacht.

    ⚠ Es sind wichtige Grundlagen.



  • DirkB schrieb:

    Motors-Freak schrieb:

    Mein Problem ist jetzt, dass ich noch sogut wie gar keine Grundlagen über Strings habe.

    Dann ist genau jetzt der Zeitpunkt sich diese Grundlagen anzueignen. Denn dafür ist diese Aufgabe gemacht.

    ⚠ Es sind wichtige Grundlagen.

    Wo gwenau finde ich die passenden Grundlagen? Wo genau sind sie am besten zusammen gefasst, auch für Anfänger?

    Danke schonmal an Alle!


  • Mod

    Motors-Freak schrieb:

    Wo gwenau finde ich die passenden Grundlagen? Wo genau sind sie am besten zusammen gefasst, auch für Anfänger?

    In einem Buch. Vorzugsweise nicht dem von Jürgen Wolf.



  • Falls es auch relativ einfaches Englisch sein darf, gibts auch PDF-Downloads für z.B. "C Primer Plus (5th Edition)". Ist als Lehrbuch gestaltet und in jedem Fall besser als JW.



  • DAS muss in jeder Einführung in die C-Programmiersprache stehen.
    Wie gut oder verständlich das ist, ist eine andere Sache.

    Und wenn du erstmal http://de.wikibooks.org/wiki/C-Programmierung nimmst.



  • Wutz schrieb:

    Dass dir der Ansatz fehlt, ist völlig klar, da dir das Grundwissen über die Funktionalität der Standardbibliothek fehlt und u.a. damit auch ein Konzept zum Programmdesign.

    Solche Vorwürfe finde ich überzogen. Klar, die Standardbibliothek ist überschaubar und nützlich, aber wer lernt die denn ernsthaft auswendig, bevor er die ersten Gehversuche macht? Ich zumindest hab die Bibliothek erst nach und nach schätzen gelernt.

    Ich glaub auch nicht, dass man erst den Compiler anwerfen darf, wenn man ein Design-Konzept hat.
    🙂



  • char i; // Alpha

    encrypt_text[(i+key)%alphasize];

    decrypt_text[(i-key+alphasize)%alphasize];



  • So mal ein kleines UPDATE!

    Habe mir heute mit einem Kumpel mal dran gesetzt. Ich sag es mal so, also verschlüsseln macht das Programm schon mal. Das Problem ist, dass er auser dem korrekt verschlüsselten Wort/Satz auch noch viele "komische" Zeichen ausgibt. Ich gehe mak davon aus, dass es irgendein Teil des ASCII Codes oder einfach nur irgendwelche Speicher aus dem RAM ist. Und was mich noch viel mehr wundert, warum gibt er mein zu verschlüsselndes Wort am Ende noch mal unverschlüsselt aus???
    Der Algorithmus ist so "klein", ich versteh das Problem nicht.

    Der jetztige Quellcode ist das absolute GRUNDGERÜST. Ich muss boß wissen wo das Problem im Moment liegt, warum er also zu dem richtigen Wort noch falsche Ziffern ausgibt. Anschließend baue ich es weiter auf.
    Danke im Vorraus!

    void main()
    {
    	char klar[5];
    	char geheim[5];
    	int i;
    
    	printf("========================================\n");
    	printf("=	Caesar-Verschluesselung        =\n");
    	printf("========================================\n\n");
    
    	printf("Bitte geben sie den Klartext ein: \n");
    	gets(klar);
    	for(i=0; i<5; i++)
    	{
    		geheim[i]=((klar[i]+1));
    
    	}
    
    	printf("%s\n",geheim);
    
    }
    


  • [hier folgt nur Blödsinn]

    Versuchs mal so:

    #include <stdio.h>
    
    int main(void)      // <------------  der Standard will das so
    {
        char klar[5] = {0};    // <----------   alle 5 auf null setzen
        char geheim[5] = {0};  // <----------   ebenso
        int i;
    
        printf("Bitte geben sie den Klartext ein: \n");
        gets(klar);
        for(i=0; i<5; i++)
        {
            geheim[i]=((klar[i]+1));
    
        }
    
        printf("%s\n",geheim);
    }
    

    Hier geht alles gut, solange nicht mehr als 4 Zeichen eingegeben werden. Achte darauf, dass ein String immer mit einer Null (vulgo Nullzeichen) abgeschlossen werden muss.

    Nachtrag:
    Es ist nicht nötig, klar zu nullen, weil es sowieso von gets() mit einer Null abgeschlossen wird. Aber schaden kann es auch nicht.


  • Mod

    Nullterminierung vergessen. printf gibt von geheim an so lange Buchstaben aus, bis es auf eine 0 im Speicher trifft. Da am Ende von geheim keine 0 steht, geht es munter weiter bis zufällig irgendwo eine steht. Auf dem Weg dahin liegt anscheinend auch deine ursprüngliche Nachricht sowie anderer Speichermüll.

    Gibt dir dein Compiler eigentlich keine Warnungen bei der Benutzung von gets?



  • Vergiss meinen Post, das war Blödsinn. Versuch's lieber so:

    #include <stdio.h>
    
    int main(void)
    {
        char klar[5];
        char geheim[5];
        int i;
    
        printf("Bitte geben sie den Klartext ein: \n");
        gets(klar);
        for(i=0; klar[i]; i++)
        {
            geheim[i]=klar[i]+1;
        }
        geheim[i] = 0;
    
        printf("%s\n",geheim);
    }
    

    Was gets() angeht, hat SeppJ völlig recht, dir davon abzuraten.



  • @mngbd: Dein korrekter Quelltext funktioniert auch nichtm bringt trotzdem noch Müll auf den Schirm,...

    @SeppJ: Ja er bringt eine Warnmeldung, aber ich kenne keine andere Lösung. Scanf fällt hier ja auch weg und bei scnaf zeigt er auch eine Warnmeldung!

    Und wieso anstatt

    i<5

    das:

    klar[i]

    Danke!


  • Mod

    Gib mal ein Wort mit 4 Buchstaben ein



  • Klappt danke 🙂
    Aber ich kann es nicht ganz nachvollziehen!

    Warum "klar[i]" anstatt "i<5" und warum kann ich einen Array wo 5 Ziffern rein gehen mit nur 4 füllen? Weil der letzte mit '\0' gefüllt ist?

    Danke!


  • Mod

    Bei Zeichenketten in C wird das Ende immer durch ein Nullzeichen markiert. Dies musst du verinnerlichen, wenn du in C mit Zeichenketten jemals was funktionierendes Programmieren willst. Hol dir am besten ein gutes ⚠ Buch in dem das erklärt wird, ein kleiner Forenbeitrag reicht da nicht.

    Mit diesem Wissen ist es leicht deine zwei Fragen zu beantworten:

    Warum "klar[i]" anstatt "i<5"?

    Woher willst du wissen, dass deine Zeichenkette genau 5 Zeichen lang ist? Das Nullzeichen markiert das Ende, also gehst du so lange durch, bis du bei einem Nullzeichen ankommst.

    warum kann ich einen Array wo 5 Ziffern rein gehen mit nur 4 füllen? Weil der letzte mit '\0' gefüllt ist?

    Ja, deswegen.



  • Motors-Freak schrieb:

    und warum kann ich einen Array wo 5 Ziffern rein gehen mit nur 4 füllen? Weil der letzte mit '\0' gefüllt ist?

    Genau.

    Motors-Freak schrieb:

    Warum "klar[i]" anstatt "i<5"

    i<5 ist eine Bedingung. Wenn die Bedingung wahr ist, ergibt sie einen Wert ungleich 0.

    Also 0 ist unwahr (falsch, nicht richtig) und ungleich 0 ist wahr (richtig).

    Da das letzte Zeichen im String 0 ist, ist an dieser Stelle die Bedingung unwahr und die Schleife ist zu Ende.

    mngbd hätte auch ;klar[i] != 0; schreiben können (was sicher lesbarer ist, aber keine Nachteile hat 😃 )

    Das ist besser als i<5, falls du mal weniger als 4 Zeichen eingibst oder das Feld nicht 5 sonder z.B. 500 Zeichen Platz bietet.



  • Moin :xmas1:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int encode(char *dest, char *source, int len, int shift)
    {
      int i;
    
      if (shift <= 0) // weil wegen sicherheit ;)
      {
        return 0;
      }
    
      shift = shift % 26; // weil wegen sonntag
    
      for (i = 0; i < len; i++)
      {
        if (source[i] >= 'A' && source[i] <= 'Z')
          dest[i] = 'A' + ((source[i] + shift - 'A') % 26); // 'A' + stelle im alphabet
        else if (source[i] >= 'a' && source[i] <= 'z')
          dest[i] = 'a' + ((source[i] + shift - 'a') % 26); // man muss hier leider etwas tricksen
        else                                                // da zB. 'z'+5 kein buchstabe mehr wär
          dest[i] = source[i];                              // wir verändern nur buchstaben
      }
    
      dest[i] = 0; // '\0' müssen wir manuell einfügen
      return i; // i sollte jetzt > 0 sein ;)
    }
    
    int main()
    {
      char buffer[0x100];
      char encoded[0x100];
      int shift = 0;
    
      printf("Caesar-encryption\n");
    
      while (shift <= 0) // man könnte hier auch gleich auf <= 26 prüfen..
      {                  // aber ich rechne ja eh shift % 26.
        printf("Please enter shift: ");
        fgets(buffer, sizeof(buffer), stdin); // fgets um anzahl der einzulesenden zeichen kontrollieren zu können
        shift = atoi(buffer); // string zu int
      }
    
      printf("Please enter your text:\n");
      fgets(buffer, sizeof(buffer), stdin);
      buffer[strlen(buffer) - 1] = 0; // eingelesendes '\n' los werden
    
      if (encode(encoded, buffer, strlen(buffer), shift)) //encode gibt true zurück wenn erfolgreich
        printf("encoded:\n%s", encoded);
      else
        printf("Error!");
    
      getchar();
      return 0;
    }
    

    Könnte man bestimmt auch wunderbar mit

    char big_lib[] = "ABCDEFGH ..";
    char small_lib[] = "abcdefgh ..";
    

    sowas lösen 😃


  • Mod

    cooky451 schrieb:

    printf("Please enter shift: ");
        fgets(buffer, sizeof(buffer), stdin); // fgets um anzahl der einzulesenden zeichen kontrollieren zu können
        shift = atoi(buffer); // string zu int
    

    Manchmal frage ich mich ob ich irgendeinen tollen Trick nicht sehe oder ob etwas einfach nur dumm ist. So auch hier. Warum nicht direkt eine Zahl einlesen?



  • SeppJ schrieb:

    cooky451 schrieb:

    printf("Please enter shift: ");
        fgets(buffer, sizeof(buffer), stdin); // fgets um anzahl der einzulesenden zeichen kontrollieren zu können
        shift = atoi(buffer); // string zu int
    

    Manchmal frage ich mich ob ich irgendeinen tollen Trick nicht sehe oder ob etwas einfach nur dumm ist. So auch hier. Warum nicht direkt eine Zahl einlesen?

    Weil ich scanf() nicht mag? 😃



  • Was ist eigendlich an scanf so böse?
    Habe das nun schon öfters hier gelesen, daß scanf nicht so toll ist.
    Was ist denn so problematisch daran?

    Gruß,
    DC


Anmelden zum Antworten