Caesar Verschlüsselung. Allgemeine Verschlüsselung.


  • 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



  • Don Carsto schrieb:

    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

    An und für sich ist scanf() nicht böse.
    Nur muss man beim Gebrauch aufpassen.

    char buffer[10];
    scanf("%s", buffer);
    

    Das wäre zB. ein typischer Fehler. Abgesehen davon dass undefiniertes Verhalten erzeugt wird falls mehr als 9 Zeichen eingegeben werden könnte man auch noch recht einfach einen exploit für ein Programm schreiben das etwas so einliest. (siehe http://de.wikipedia.org/wiki/Pufferüberlauf )

    Das gilt aber für alle C-Funktionen (man möge mich schelten falls ich jetzt was falsches schreibe :D). C-Funktionen überwachen nunmal von selbst keine Speicherbereiche. So kann

    char buffer[10];
    fgets(buffer, 100, stdin);
    

    genauso für einen exploit genutzt werden, nur ist scanf() besonders bei Anfängern die sich hier noch keine Gedanken machen als quasi-Gegenstück zu printf() sehr beliebt und wird somit halt oft "falsch" benutzt. (Viele vergessen beim einlesen von Zahlen auch gerne mal den Adressoperator..)
    Dabei wohnt scanf() aber wie schon gesagt das Böse eigentlich nicht inne und kann in dieser Form:

    int num;
    char buffer[10];
    scanf("%i", &num);
    scanf("%9s", buffer);
    

    auch problemlos genutzt werden.

    Ich mag es halt nur nicht weils sich auf der Konsole komisch verhält aber das ist ne andere Geschichte und auch nur eine persönliche Meinung :xmas1:



  • Hallo
    Habe zur Zeit ein kleines Problem. Bin immer noch an meinem verschlüsselungs Programm bei.
    Mein Problem Zur Zeit ist, dass ich NICHT in einer IF Anweisung das GETS benutzen kann. Genauso wenig NACH einer IF Anweisung. Das Programm überspringt dann alles und wartet gar nicht auf eine Eingabe, wieso nich? Benutze ich das GETS jedoch vor der ersten IF Anweisung funktioniert es Einwandfrei. In Der IF Anweisung oder danach funktioniert es nicht mehr. Wieso?

    Gruß



  • Weil deine If Anweisung es verhindert, daß dein Code ausgeführt wird, sprich die if Anweisung ist nicht wahr.

    Und ohne Codebeispiel ist es geradezu unmöglich zu sagen warum genau.



  • Die Funktionen kopiere ich jetzt mal nicht mit rein.

    void main()
    {
    	char klar[501];
    	char geheim[501];
    	char text[501];
    	int i;
    	int wahl1=0;
    	int wahl2=0;
    	int a=0;
    	int TEST=0;
    
    	printf("========================================\n");
    	printf("=	Caesar-Verschluesselung        =\n");
    	printf("========================================\n\n");
    
    nochmal:
    
    	printf("Bitte waehlen Sie, ob sie einen Text eingeben wollen[1], oder ob Sie einen Text\naus einer Datei laden moechten[2]: \n");
    	scanf("%i",&wahl1);
    
    	if(wahl1==1 || wahl1==2)
    	{
    		if(wahl1==1)
    		{
    				printf("Bitte geben sie den Text ein (Max. 500 Zeichen): \n");
    				gets(text);
    				printf("\nIhr Satz besteht aus %i Zeichen.\n",strlen(text));
    
    		}
    
    		else
    		{
    			printf("...kommt noch...\n");
    		}
    
    	}
    
    	else
    	{
    		printf("\nE R R O R\n\n");
    		goto nochmal;
    	}
    
    /*	printf("Bitte geben sie den Text ein (Max. 500 Zeichen): \n");
    	gets(text);
    	printf("\nIhr Satz besteht aus %i Zeichen.\n",strlen(text));
    */
    
    	printf("\nBitte waehlen sie ob sie Entschluesseln [1] oder Verschluesseln [2] wollen: \n");
    	scanf("%i",&wahl2);
    
    	if(wahl2==1 || wahl2==2)
    	{
    		if(wahl2==1)
    		{
    
    			printf("Bitte geben sie den Schluessel ein: \n");
    			scanf("%i",&a);
    			entschluesseln(a, text);
    		}
    
    		else
    		{
    			printf("Bitte geben sie den Schluessel ein: \n");
    			scanf("%i",&a);
    			verschluesseln(a, text);
    		}
    	}
    
    	else
    	{
    		printf("E R R O R\n\n\n");
    		goto nochmal;
    	}
    }
    


  • if(wahl1==1 || wahl1==2)
    

    Format ändern in:

    if((wahl1==1) || (wahl1==2))
    

    Also mehr Klammern.



  • Springt trotzdem drüber, erlaubt also keine Texteingabe...



  • Ja er überspringt das gets() weil da noch ein \n im Puffer ist.

    Das kannste abfangen indem du ein getchar(); hinterschaltest.

    if(wahl1==1)
            {       
                    getchar();
                    printf("Bitte geben sie den Text ein (Max. 500 Zeichen): \n");
                    gets(text);
                    printf("\nIhr Satz besteht aus %i Zeichen.\n",strlen(text));
    


  • Oder arbeite auch bei den weiteren Texteingaben mit scanf().



  • Don Carsto schrieb:

    Oder arbeite auch bei den weiteren Texteingaben mit scanf().

    Aber mit Scanf kann ich doch keine Sätze aufnehmen, da scanf doch nur bis zu einem Leerzeichen Scant oder nicht???



  • Stimmt.



  • lösch einfach den buffer... wenn das einlesen übersprungen wird heißt das ja das was im eingabebuffer drinnen ist... is keine schöne art aber ich habs meiner zeit so gelernt:

    fflush(stdin);
    

    versuch das mal...



  • itedvo schrieb:

    lösch einfach den buffer... wenn das einlesen übersprungen wird heißt das ja das was im eingabebuffer drinnen ist... is keine schöne art aber ich habs meiner zeit so gelernt:

    fflush(stdin);
    

    versuch das mal...

    tolle idee 🙄



  • :xmas1:
    (Notlösungsalarm)
    :xmas1:

    aber wenn alle hebel brechen kann diese funktion leben retten =b :xmas1: :xmas2:



  • itedvo schrieb:

    :xmas1:
    (Notlösungsalarm)
    :xmas1:

    aber wenn alle hebel brechen kann diese funktion leben retten =b :xmas1: :xmas2:

    alter, alter das ist einfach falsch und dein notlösungs späßchen machts leider auch nicht richtig. schau doch mal in die faq, wurde schon tausendmal im forum besprochen. 🙄



  • ich glaub die lösung ging so...

    void cb(){
      int c;
      while((c = getchar()) && c != '\n' && c != EOF);
    }
    


  • denk das war falsch... müsste eher so sein...

    void cb(){
      int c;
      while((c = getchar()) != '\n' && c != EOF);
    }
    


  • Don Carsto schrieb:

    Stimmt.

    Alles Schrott bis hierher.
    *scanf ist weitaus flexibler als in eurer Vorstellungswelt. Lest die Spezifikation dazu und trefft keine Entscheidungen aus eurem Halbwissen heraus.
    fflush(stdin) ist der nächste Schrott hier im Thread und steht an der Spitze des von Laien hier geposteten Schwachfug.


Anmelden zum Antworten