chiffrierungsfrage



  • 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