chiffrierungsfrage



  • Wie gesagt: Das Thema beantwortet in keinster weise meine Frage...
    und sscanf() funktioniert doch auch nciht so, weil ich doch immer eine bestimmte Anzahl an Integer-Werten haben muss...
    ich hab ja aber in jeder Zeile eine unterschiedliche Anzahl von Integerwerten...

    und das umwandeln hat ja eh nciht funktioniert...
    ich hoffte nur dass ichs irgendwie zusammenführen kann wie z.B:

    char string[2]={'1','8','\0'}
    

    wird zu

    int i=18
    

    oder sowas in der Art
    dann hätt ichs ja nämlich auch einfach zeichenweise einlesen können...



  • Wie das geht, hab ich im letzten Post geschrieben 😉
    Hier ein Beispiel:

    char* str = "18";
    int zahl = atoi(str);
    

    MfG, Jochen



  • Ahhh...so war das gemeint 🙂

    werd ich mal gleich probieren obs so funktioniert wie ich mir das vorstelle...
    Danke 😃



  • Nur zur Info

    char string[2]={'1','8','\0'};  //  ist falsch da 3 Zeichen lang
    char string[3]={'1','8','\0'};   //  ist richtig
    // oder 
    char string[]={'1','8','\0'};    
    char string[]="18";
    


  • also das mit dem atoi funktioniert ja echt super 🙂 werd ich mir merken...
    hilft mir trotzdem irgendwie nicht weiter...stell mich heut anscheinend echt zu doof an -.-*

    hab mal meinen Code angehangen, damit erstmal ersichtlich wird, was ich für ne idee hatte..er funktioniert zwar nicht richtig wegen 2 Problemen mit dem Schlüssel (s. u.) aber das grundgerüst steht 😉

    #include <stdio.h>
    #include <stdlib.h>
    
    int main(void)	
    {
    	int codeletter,keyletter,decodeletter;
    	FILE *codefile, *keyfile, *decodefile;
    
    	// Datei code.txt zum Lesen öffnen
    	codefile = fopen("code.txt", "r");
    	// Datei key.txt zum Lesen öffnen
    	keyfile = fopen("key.txt", "r");
    	// Anlegen der Datei decode.txt zum Schreiben (falls vorhanden: überschreiben)
    	decodefile = fopen("decode.txt", "w+");
    
    	//Fehlerüberprüfung
    	if(codefile==NULL)
    	{
    		printf("Fehler beim Lesen der Datei 'code.txt'\n");
    		printf("Überprüfen Sie ggf. die Leserechte oder die Existenz der Datei!\n");
    		return(EXIT_FAILURE);
    	}
    	if(keyfile==NULL)
    	{
    		printf("Fehler beim Lesen der Datei 'key.txt'\n");
    		printf("Überprüfen Sie ggf. die Leserechte oder die Existenz der Datei!\n");
    		return(EXIT_FAILURE);
    	}
    	if(decodefile==NULL)
    	{
    		printf("Fehler beim Schreiben der Datei 'decode.txt'\n");
    		printf("Existiert die Datei vllt. schon schreibgeschützt?\n");
    		return(EXIT_FAILURE);
    	}
    
    	/********************************************************/
    	/*			Hauptteil	     						*/
    	/*	10/32 ASCII Für Leerzeichen/Zeilenumbruch 		*/
    	/********************************************************/
    
    	while( (keyletter=fgetc(keyfile))!=EOF && keyletter!=10 && keyletter!=32)
    	{
    		while( (codeletter=fgetc(codefile)) != EOF)
    		{
    			if(codeletter == 10 || codeletter == 32) 
    			{
    				decodeletter=codeletter;
    			}
    			else
    			{
    				decodeletter=codeletter-keyletter;
    			}
    
    			if(decodeletter<97 && decodeletter!=10 && decodeletter!=32)
    			{
    				decodeletter+=26;
    			}
    
    			fputc(decodeletter,decodefile);
    		}
    	}
    
    	fclose(codefile);
    	fclose(keyfile);
    	fclose(decodefile);
    
    	return EXIT_SUCCESS;	
    }
    

    Das erste Problem hierbei ist: Er würde nur eine "keyletter"-Zahl ausgeben...zählt denn das EOF der codefile auch als EOF für die keyfile?!

    und das zweite war wie schon oben beschrieben die Realisierung des 2-Ziffern-Einlesens...habs auch mit ins string kopieren versucht ging aber auch nicht wirklich...



  • DirkB schrieb:

    Nur zur Info

    char string[2]={'1','8','\0'};  //  ist falsch da 3 Zeichen lang
    char string[3]={'1','8','\0'};   //  ist richtig
    // oder 
    char string[]={'1','8','\0'};    
    char string[]="18";
    

    jau klar...tippfehler...danke für den Hinweis 🙂



  • Crayven schrieb:

    also das mit dem atoi funktioniert ja echt super 🙂 werd ich mir merken...

    Würde ich nicht machen, da atoi keine Fehlerbehandlung anbietet, d.h. z.B. ist

    atoi("bla") == atoi("0") == atoi("0.123")
    

    was in den seltensten Fällen beabsichtigt sein sollte, besser ist strtol bzw. das erwähnte sscanf, welches natürlich auch für eine variable Anzahl von Integerauswertungen einsetzbar ist.



  • Du liest aus deinem Keyfile ein Zeichen (bei deinem Beispiel '1' = 49)
    Dann liest du bis zum Dateiende aus codefile und wandelst die Zeichen um (mit keyletter = 49).
    Dann liest du das Nächste Zeichen aus keyfile (' ' = 32).
    Dann liest du bis zum Dateiende aus codefile ... Ach ne du bist ja schon am Dateiende von Codefile ⚠

    Willst du das wirklich?

    Erkläre uns (dir) mal was du wirklich vorhast. Warum stehen im Keyfile verschiedene Keys.

    Mach dir den Unterschied zwischen 1 und '1' und "1" klar.



  • hm...in der C-Reference konnt ich das jetzt nicht rauslesen...

    aber ich hab nochmal eine andere Variante ausprobiert...und zwar mit tokenizing...

    while(fgets(codestring,50,codefile) && fgets(keystring,50,keyfile))
    	{
    		printf("Originalcodezeile: %s",codestring);
    		printf("Originalkeyzeile: %s",keystring);
    
    		ptrcode= strtok(codestring, " ");
    		ptrkey= strtok(keystring, " ");
    		while(ptrcode != NULL && ptrkey != NULL) 
    		{
    			printf("ptrcode: %p %d\n",ptrcode,*ptrcode);
    			printf("ptrkey:  %p %d\n",ptrkey,*ptrkey);
    			printf("code: %s\n",ptrcode);
    			printf("key: %s\n\n",ptrkey);
    			ptrcode = strtok(NULL, " ");
    			ptrkey = strtok(NULL, " ");
    		}
    
    	}
    

    Das einzige Problem hierbei ist:
    In der while(ptrcode[...])-Schleife --> der ptrkey-Pointer zeigt ab dort immer auf die Adresse des ptrcode pointers...gibt es eine möglichkeit mehrere strtok()-Funktionen zeitgleich zu verwenden?!

    Beispielausgabe einer Zeile:

    Originalcodezeile: lfk kisbgqvs xwctc cnngp kot oaxqnb pocd
    Originalkeyzeile: 3 14 15 2 6 9 10
    ptrcode: 0xbfaf84fc 108
    ptrkey: 0xbfaf852e 51
    code: lfk
    key: 3

    ptrcode: 0xbfaf8530 49
    ptrkey: 0xbfaf8533 49
    code: 14
    key: 15

    ptrcode: 0xbfaf8536 50
    ptrkey: 0xbfaf8538 54
    code: 2
    key: 6

    ptrcode: 0xbfaf853a 57
    ptrkey: 0xbfaf853c 49
    code: 9
    key: 10

    schon ab dem 2. Durchlauf wird fortlaufend der key ausgegeben...obwohl die Adresse und der Wert, auf die die Pointer zeigen unterschiedlich sind...
    warum und was muss ich ändern? 😕
    danke wieder für die Hilfe 🙂



  • @Dirk:

    Der Unterschied ist mir bewusst...

    ich wollte die Zahl des Keys des Wortes von dem ASCII-Code des Code-Buchstabens subtrahieren, dass ich auf den ASCII-Code des decodierten Buchstabens komme und dieser wird ja dann wieder als "Normaler" Buchstabe ausgegeben...

    das im groben 😉



  • aber stimmt...darin liegt noch ein fehler...
    wäre bestimmt bei der Ausführung des Programmes aufgefallen :xmas2:
    aber bis dahin komme ich auch mit dem Hinweis mit dieser Variante nicht...ich muss ja trotzdem noch die zahlen und nciht die ziffern auslesen...

    deswegen variante 2 mit dem tokenizing...scheint auch die bessere variante zu sein oder was meint ihr?!



  • Nein strtok geht zu einer Zeit nur für einen string.

    Wutz hat die schon die besseren Lösungen genannt.

    Willst du für jedes Wort eine andere Verschlüssselung haben?



  • Crayven schrieb:

    gibt es eine möglichkeit mehrere strtok()-Funktionen zeitgleich zu verwenden?!

    Nein.



  • Crayven schrieb:

    deswegen variante 2 mit dem tokenizing...scheint auch die bessere variante zu sein oder was meint ihr?!

    Nein.



  • eigentlich solls ja entschlüsselt werden...
    und ich habe halt 2 dateien...einmal den verschlüsselten text und einmal die schlüsseldatei, in der ein schlüssel pro wort vorliegt...

    danke nochmal an euch beide...
    werd noch n bissl rumprobieren (vllt mit ner kombo aus beiden?!) 🙂



  • Du hast also im Codefile Zeilen mit n Wörtern und im Keyfile ebenso viel Zeilen mit n Keys. (Jede Zeile kann ein anderes n haben)

    Hast du es denn schon mal mit fscanf probiert?

    main.c

    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
       FILE *fdc, *fdk;
       char text[100];
       int key;
    
        fdc = fopen("main.c","r");
    //  fdk = fopen("main.key","r");
    
        while (!feof(fdc)) {
            fscanf(fdc,"%s",text);
    //      fscanf(fdk,"%i",key);
            printf("<%s>\n",text);
        }
    
    //  fclose(fdk);
        fclose(fdc);
    
        return 0;
    }
    

    listet mir Wort für Wort die Datei main.c auf.
    Fehlerabfrage musst du einbauen.



  • Dann ist es ja nicht mehr formatiert...und ich glaube es soll formatiert bleiben...

    habe einen code geschrieben, den ich jetzt nur noch richtig verschachteln muss:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(void)	
    {
    	int codeletter,keynumber,decodeletter;
    	char keystring[20],*ptrkey;
    	FILE *codefile, *keyfile, *decodefile;
    
    	// Datei code.txt zum Lesen öffnen
    	codefile = fopen("code.txt", "r");
    	// Datei key.txt zum Lesen öffnen
    	keyfile = fopen("key.txt", "r");
    	// Anlegen der Datei decode.txt zum Schreiben (falls vorhanden: überschreiben)
    	decodefile = fopen("decode.txt", "w+");
    
    	//Fehlerüberprüfung
    	if(codefile==NULL)
    	{
    		printf("Fehler beim Lesen der Datei 'code.txt'\n");
    		printf("Überprüfen Sie ggf. die Leserechte oder die Existenz der Datei!\n");
    		return(EXIT_FAILURE);
    	}
    	if(keyfile==NULL)
    	{
    		printf("Fehler beim Lesen der Datei 'key.txt'\n");
    		printf("Überprüfen Sie ggf. die Leserechte oder die Existenz der Datei!\n");
    		return(EXIT_FAILURE);
    	}
    	if(decodefile==NULL)
    	{
    		printf("Fehler beim Schreiben der Datei 'decode.txt'\n");
    		printf("Existiert die Datei schon schreibgeschützt?\n");
    		return(EXIT_FAILURE);
    	}
    
    	while( (codeletter=fgetc(codefile)) != EOF)
    	{
    		if(codeletter == 10 || codeletter == 32) //ASCII Für Leerzeichen/Zeilenumbruch
    		{
    			decodeletter=codeletter;
    		}
    		else
    		{
    			decodeletter=codeletter-keynumber;
    		}
    
    		if(decodeletter<97 && decodeletter!=10 && decodeletter!=32)
    		{
    			decodeletter+=26;
    		}
    		fprintf(decodefile,"%d",keynumber);
    		fputc(decodeletter,decodefile);
    	}
    
    	while(fgets(keystring,50,keyfile))
    	{
    		printf("Originalkeyzeile: %s",keystring);
    		ptrkey= strtok(keystring, " ");
    		while(ptrkey != NULL) 
    		{
    			keynumber=atoi(ptrkey);
    			printf("key: %d\n",keynumber);
    			ptrkey = strtok(NULL, " ");
    		}
    
    	}
    
    	fclose(codefile);
    	fclose(keyfile);
    	fclose(decodefile);
    
    	return EXIT_SUCCESS;	
    }
    

    also muss ich jetzt nur noch rausfinden, wo ich was in welcher reihenfolge einsetzen muss 😉



  • Ups...Sorry...das war mein rumprobier-code 😉

    hier der eigentliche:

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main(void)	
    {
    	int codeletter,keynumber,decodeletter;
    	char keystring[20],decodestring[50],tokcode[10],tokkey[5],*ptrkey;
    	FILE *codefile, *keyfile, *decodefile;
    
    	// Datei code.txt zum Lesen öffnen
    	codefile = fopen("code.txt", "r");
    	// Datei key.txt zum Lesen öffnen
    	keyfile = fopen("key.txt", "r");
    	// Anlegen der Datei decode.txt zum Schreiben (falls vorhanden: überschreiben)
    	decodefile = fopen("decode.txt", "w+");
    
    	//Fehlerüberprüfung
    	if(codefile==NULL)
    	{
    		printf("Fehler beim Lesen der Datei 'code.txt'\n");
    		printf("Überprüfen Sie ggf. die Leserechte oder die Existenz der Datei!\n");
    		return(EXIT_FAILURE);
    	}
    	if(keyfile==NULL)
    	{
    		printf("Fehler beim Lesen der Datei 'key.txt'\n");
    		printf("Überprüfen Sie ggf. die Leserechte oder die Existenz der Datei!\n");
    		return(EXIT_FAILURE);
    	}
    	if(decodefile==NULL)
    	{
    		printf("Fehler beim Schreiben der Datei 'decode.txt'\n");
    		printf("Existiert die Datei vllt. schon schreibgeschützt?\n");
    		return(EXIT_FAILURE);
    	}
    
    	while( (codeletter=fgetc(codefile)) != EOF)
    	{
    		if(codeletter == 10 || codeletter == 32) //ASCII Für Leerzeichen/Zeilenumbruch
    		{
    			decodeletter=codeletter;
    		}
    		else
    		{
    			decodeletter=codeletter-keynumber;
    		}
    
    		if(decodeletter<97 && decodeletter!=10 && decodeletter!=32)
    		{
    			decodeletter+=26;
    		}
    				fprintf(decodefile,"%d",keynumber);
    				fputc(decodeletter,decodefile);
    			}
    
    	while(fgets(keystring,50,keyfile))
    	{
    		printf("Originalkeyzeile: %s",keystring);
    
    		ptrkey= strtok(keystring, " ");
    
    		while(ptrkey != NULL) 
    		{
    			keynumber=atoi(ptrkey);
    			printf("key: %d\n",keynumber);
    			ptrkey = strtok(NULL, " ");
    		}
    
    	}
    
    	fclose(codefile);
    	fclose(keyfile);
    	fclose(decodefile);
    
    	return EXIT_SUCCESS;	
    }
    

Anmelden zum Antworten