chiffrierungsfrage
-
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 CodefileWillst 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: 3ptrcode: 0xbfaf8530 49
ptrkey: 0xbfaf8533 49
code: 14
key: 15ptrcode: 0xbfaf8536 50
ptrkey: 0xbfaf8538 54
code: 2
key: 6ptrcode: 0xbfaf853a 57
ptrkey: 0xbfaf853c 49
code: 9
key: 10schon 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
-
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; }