chiffrierungsfrage
-
Hallo
und zwar gehts um das Caesar-Chiffrierungsverfahren. (ich habe schon die Suchfunktion benutzt aber nichts gefunden was mir weiterhilft)
Ich habe eine *.txt datei mit nem verschlüsselten text und eine zweite mit den schlüsseln. Der Entschlüsselte Text soll in eine dritte Datei ausgegeben werden.So weit weiß ich schon wie ichs machen werde, aber ich habe folgendes Problem:
Dazu testtext zur Veranschaulichung :text schrieb:
Dies ist
eine Testversion zum
"entschlüsseln"key schrieb:
1 2
5 9 20
12Ein Key hat unter anderem 2 Ziffern...mit einer würde ich es realisiert bekommen aber ich finde einfach keine richtige möglichkeit die zweistellige zahl in einen integerwert zu speichern...
weil den code kann ich ja zeichenweise dechiffrieren...
ich habe auch schon probiert die keys in 2-stellige (bzw 3-stellige mit \0 ) Strings zu kopieren und die dann in int zu typecasten aber das geht auch ncihtund mit tokenizing (strtok() ) komm ich auch nicht so ganz klar weil ich ja dann den key erst zeilenweise mit fgets() in einen string kopieren müsste und dann irgendwie auch wieder in integer typecasten...oder täusche ich mich da?! Oo
wäre über jeden tip Dankbar
viele GrüßeCrayven
-
Also das Thema ist für dich immer noch nicht ausreichend behandelt in u.a.?
http://www.c-plusplus.net/forum/278766?highlight=caesar
Man kann auch Integerwerte aus Textdateizeilen direkt auslesen und Typecasten auf int von char geht in C nicht. Dazu schaue dir doch mal sscanf(...,"%d...) an.
-
Und zu den Strings:
Man kann strings nicht mit einem Typecast in eine Zahl umwandeln.
Um einen String in eine Zahl umzuwandeln, gibt es Funktionen wie atoi (ASCII to Integer) und atof (ASCII to float).MfG, Jochen
-
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 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