Caesar Verschlüsselung. Allgemeine Verschlüsselung.
-
Also, die Aufgabe erscheint mir nicht so ganz trivial. Normalerweise würde es ja reichen, auf jeden Buchstaben die "Verschiebung" draufzuzählen. Wenn man im ASCII-Code auf den Buchstaben z eins draufzählt, kommt aber nicht a heraus (was ja auch cooky451 schon schreibt). Man könnte einen passenden Wert von Buchstaben größer als ... abziehen und so eine ABC-Rotation hinbekommen. Und dann muss man noch Sonderzeichen und Co beachten. Und dann noch die Eingabebedingungen der C-Grammatik gut verstanden haben und schon Problem- und Debuggingerfahrung damit haben...
Assembler ist hier angenehmer, und man kann auch leichter verstehen, was zu tun ist, aber das nur nebenbei. Um eine Rotation hinzubekommen, ist es vielleicht praktisch, das ABC z.B. zweimal in den Speicher zu schreiben, um dann die entsprechende Verschiebung aus der Tabelle auszulesen. Sonderzeichen und Steuerungscodes kann man für den Anfang ausschließen, oder durch eine Markierung ersetzen.
Speichergeschichten und Pointerrechnerei sind allerdings alles andere als absolut Anfängerfreundlich, man sollte also schon paar Stunden C-Grundlagenbüffelei inclusive Debuggingstunden hinter sich haben bevor man sich an diese vermeintlich einfache "Challenge" heranwagt.
-
man sollte erstmal das wort trivial aus dem text streichen
-
__-- schrieb:
man sollte erstmal das wort trivial aus dem text streichen
ach, das ist doch nur so eine Art Euphemismus.
-
nachtfeuer schrieb:
__-- schrieb:
man sollte erstmal das wort trivial aus dem text streichen
ach, das ist doch nur so eine Art Euphemismus.
ja dann verwende doch dieses triviale wort um mit deinen trivialen programmen triviale probleme zu lösen. - ich könnt so kotzen :p
-
Wow, tatsächlich. Habe (nach langer Suche) etwas gefunden.
scanf(" %[^\n]s",&text);
Nun liest scanf() auch Strings mit Whithespaces ein.
Sieht so aus, als wäre scanf() tiefgründiger als angenommen und weitere Studien durchaus erforderlich.
Danke Wutz, für den Hinweis.
Gruß,
DC
-
Don Carsto schrieb:
Wow, tatsächlich. Habe (nach langer Suche) etwas gefunden.
scanf(" %[^\n]s",&text);
Nun liest scanf() auch Strings mit Whithespaces ein.
Sieht so aus, als wäre scanf() tiefgründiger als angenommen und weitere Studien durchaus erforderlich.
Danke Wutz, für den Hinweis.
Gruß,
DCSchon wieder 2 Fehler in einer Zeile und den wichtigen scanf Rückgabewert wertest du auch nicht aus.
Es scheint wohl doch nicht so trivial zu sein?char eingabe[100]; if( 1==scanf("%99[^\n]%*[\n]",eingabe) ) puts("eingabe ok"); else puts("eingabe fehler");
-
Hey Leute!
Wow das ist aber wirklich toll, dass jetzt so viele versuchen zu helfen hier
Also mein Professor hat uns geraten im 1ten Semester das Problem vorerst mitfflush(stdin)
zu lösen. Ich habe mich heute mal mit einem C Buch in die Bücherrei der FH gesetzt und mal ein bisschen rum probiert. Raus kam mein relativ großer Quelltext den ich nun unten gepostet habe. Die größte neuerung an meinem Quelltext ist nun, dass ich aus einer Datei einen Text lade und anschließend dieser wieder in einer Datei abgespeichert wird.
Nun habe ich noch zwei Probleme, wobei ich gerne unterstützung hätte:1.Ich bekomme es nicht anders hin, wenn ich aus einer Datei einen Text lade, ich diesen Angezeigten Text erst einmal abtippen muss in die Console um ihn in ein Array zu bekommen. Laut dem Buch holt die Funktion "putchar" nur einzelne Buchstaben aus dem Dokument. Ich weiß nicht wie ich das ganze direkt aus einer Datei in einen Array speichern kann und es anschließend zu verschlüsseln.
2.Ich habe schon viel im Internet recherchiert, finde aber keinen geeignetetn einfachen Weg nur innerhalb des ABC zu verschlüsseln, also dass nach Z wieder A kommt. Ich habe irgendwas von Modulo 26 gelesen, weiß dies aber nicht so recht umzusetzen.
Achja, wundert euch nicht über die etwas simplen Kommentare, ich brauchte diese um alles einigermaßen zu verstehen.
#include<stdio.h> #include<string> #include<string.h> #include<math.h> #include<cstdio> double verschluesseln(int a, char klar[]) { char geheim[501]; int i; for(i=0; klar[i]!=0; i++) { geheim[i]=klar[i]+a; } geheim[i] = 0; //Setzt nach dem letzten Buchstaben eine Null um die Abfrage abzubrechen printf("\n%s\n",geheim); FILE *stream; char text[81], dateiname[67]; int zeilen=0; printf("\nName der Datei in der gespeichert werden soll: "); fflush(stdin); gets(dateiname); if((stream = fopen(dateiname,"w"))==NULL) { printf("\nFehler beim Oeffnen!"); exit(1); } fprintf(stream,"%s\n",geheim); fclose(stream); return 0; } double entschluesseln(int a, char geheim[]) { int i; char klar[501]; for(i=0; geheim[i]!=0; i++) { klar[i]=geheim[i]-a; } klar[i]=0; printf("\n%s\n",klar); return 0; } void main() { char klar[501]; char geheim[501]; char text[501]; int i=0; int wahl1=0; int wahl2=0; int a=0; int ch; char dateiname[67]; //fflush(stdin); printf("========================================\n"); printf("= Caesar-Verschluesselung =\n"); printf("========================================\n\n"); nochmal: FILE *stream; printf("Welche Datei wollen Sie lesen??: "); gets(dateiname); if((stream = fopen(dateiname,"r"))==NULL) //liest die Datei und weißt den Rückgabewert Stream zu. Stream und NULL wird verglichen { printf("\nFehler beim Oeffnen!"); exit(1); } ch=fgetc(stream); //liest ein Zeichen aus einer Datei und gibt es als int-Wert zurück. Der Wert wird der Variablen CH zugewiesen. while(!feof(stream)) { putchar(ch); ch=fgetc(stream); } fclose(stream); printf("\nBitte geben sie nun den oben angezeigten Text ein: \n"); //Ich weiß nicht wie ich es sonst hin bekomme, den gelesenen Text in ein Array zu bekommen... SEHR KOMPLIZIERT gets(text); printf("Ihr eingegebener Text lautet: %s\n\n",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; } }
Danke im Vorraus an alle!
-
Nunja, auch wenn ich ein Verfechter der verpönten goto's bin ist das Nutzen von goto hier sicher sehr einfach (eigene Funktion) vermeidbar.
Ausserdem -> Hast du mal probiert was raus kommt wenn du den Text "zzz" verschlüsseln willst? :xmas1:
Edit:
- Komischer Prof der euch (wenn auch nur im 1. Semester) rät fflush(stdin) zu nutzen. Was ist denn mit Leuten ohne Windows Lizenz?(Ausserdem ist das ausweichen auf diese Schleife nicht wirklich schwer)
- gets() ist auf stdin unsicher. Verwende besser fgets() oder scanf() :xmas1:
Edit2:
- Warum geben deine Funktionen double zurück? Sollte int nicht reichen?
- Es sollte wohl int main() und nicht void main() sein :xmas1:Edit3:
- Siehe Kommentar in Zeile 98 deines Codes:
-> schau dir mal
http://www.cplusplus.com/reference/clibrary/cstdio/
http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/
http://www.cplusplus.com/reference/clibrary/cstdio/fgets/
http://www.cplusplus.com/reference/clibrary/cstdio/fread/an
Edit4:
Ganz am ende wäreif (x == y) { .. } else if (x == z) { .. } else { error }
Vielleicht übersichtlicher
-
Motors-Freak schrieb:
Ich habe mich heute mal mit einem C Buch in die Bücherrei der FH gesetzt und mal ein bisschen rum probiert. Raus kam mein relativ großer Quelltext den ich nun unten gepostet habe.
probier's mal nüchtern, da programmiert's sich leichter
-
mezzo mix schrieb:
Motors-Freak schrieb:
Ich habe mich heute mal mit einem C Buch in die Bücherrei der FH gesetzt und mal ein bisschen rum probiert. Raus kam mein relativ großer Quelltext den ich nun unten gepostet habe.
probier's mal nüchtern, da programmiert's sich leichter
Kann ich nur bestätigen. Was man nachts/morgens noch für mehr als genial hält tut sich später meist als ziemlicher **** hervor
-
Motors-Freak schrieb:
Also mein Professor hat uns geraten im 1ten Semester das Problem vorerst mit
fflush(stdin)
zu lösen.
LOL, erstmal seinen Leuten aus eigener Unwissenheit was Falsches beibringen um es ihnen dann evtl. wieder auszureden, ziemlich durchschaubar die laienhaften Vorstellungen eures Prof., Pisa lässt grüßen.
Motors-Freak schrieb:
Ich habe mich heute mal mit einem C Buch in die Bücherrei der FH gesetzt
Beachtlich, ich dachte sowas gibts heute nicht mehr.
-
2.Ich habe schon viel im Internet recherchiert, finde aber keinen geeignetetn einfachen Weg nur innerhalb des ABC zu verschlüsseln, also dass nach Z wieder A kommt. Ich habe irgendwas von Modulo 26 gelesen, weiß dies aber nicht so recht umzusetzen.
Man könnte das ja so lösen:
if ((klar[i]+a) > 'Z') klar[i] = klar[i] - 'Z' + 'A' -1; geheim[i]=klar[i]+a;
So, testen wir mal eben logisch aus, ob es klappen könnte.
Wenn also klar[i] = 'X' ist und du 7 draufzählst und wir mal annehmen, daß 'Z' den Wert 90 hätte, dann würde 'X' den Wert 88 haben und 'A' 65.
88 - 90 ist -2 + 65 -1 = 62.
62 + 7 = 69.
So, nun testen.
X Y Z A B C D E F G
0 1 2 3 4 5 6 7 8 9Es müßte also bei 'X' + 7 -> 'E' rauskommen.
A = 65, B = 66, C = 67, D = 68, E = 69.Es scheint also zu funktionieren.
Oder aber auc so:
geheim[i]=klar[i]+a; if (geheim[i]>'Z') geheim[i] = geheim[i] - 'Z' + 'A' - 1;
88 + 7 = 95.
95 - 90 + 65 - 1 = 69.Klappt wohl auch.
Gruß,
DC
-
So um das Thema nochmal zu vervollständigen.
Ich habe meine Projekt fertig bekommen und 86% dafür bekommen. Für die die es interessiert hau ich es jetzt nochmal hier rein:Main
#include<stdio.h> #include<string> #include<string.h> #include<math.h> #include<cstdio> #include "funktionen.h" void main() { char klar[501]; char geheim[501]; char text[501]; int i=0; int wahl1=0; int wahl2=0; int a=0; int ch; char dateiname[67]; //fflush(stdin); printf("========================================\n"); printf("= Caesar-Verschluesselung =\n"); printf("========================================\n\n"); nochmal: FILE *stream; printf("Welche Datei wollen Sie lesen??: "); gets(dateiname); if((stream = fopen(dateiname,"r"))==NULL) //liest die Datei und weißt den Rückgabewert Stream zu. Stream und NULL wird verglichen { printf("\nFehler beim Oeffnen!"); } else { i=0; while(!feof(stream)) { text[i]=fgetc(stream); i++; } text[i] = 0; fclose(stream); printf("\nIhr eingegebener Text lautet: %s\n\n",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; } } }
Dann die Header-Datei:
#double entschluesseln(int a, char klar[]); double verschluesseln(int a, char klar[]);
Und die Funktionen:
#include<stdio.h> #include<string> #include<string.h> #include<math.h> #include<cstdio> double verschluesseln(int a, char klar[]) { char geheim[501]; int i; for(i=0; klar[i]!=0; i++) { if ((klar[i]+a) > 'z' ) { klar[i] = klar[i] - 'z' + 'a' -1; } if ((klar[i]+a) > 'Z' && (klar[i]+a <'a') ) { klar[i] = klar[i] - 'Z' + 'A' -1; } if((klar[i]) == 32) { klar[i] = klar[i] - a ; } geheim[i]=klar[i]+a; } geheim[i] = 0; //Setzt nach dem letzten Buchstaben eine Null um die Abfrage abzubrechen printf("\n%s\n",geheim); FILE *stream; char text[81], dateiname[67]; int zeilen=0; printf("\nName der Datei in der gespeichert werden soll: "); fflush(stdin); gets(dateiname); if((stream = fopen(dateiname,"w"))==NULL) { printf("\nFehler beim Oeffnen!"); exit(1); } fprintf(stream,"%s\n",geheim); fclose(stream); return 0; } double entschluesseln(int a, char geheim[]) { int i; char klar[501]; fflush(stdin); for(i=0; geheim[i]!=0; i++) { if (((geheim[i]-a) < 'a') && ((geheim[i]-a) > 'Z') ) { geheim[i] = geheim[i] + 'z' - ('a' -1); } if ((geheim[i]-a) < 'A' && ((geheim[i]-a) > '!') ) { geheim[i] = geheim[i] + 'Z' - ('A' -1); } if((geheim[i]) == 32) { geheim[i] = geheim[i] + a ; } klar[i]=geheim[i]-a; } klar[i]=0;
Ich danke ALLEN bei ihrer mithilfe.
Gruß
-
Da fehlt die stdlib.h für exit.
Das cstdio hast du darüber schon und gibt's in C ohnehin nicht.
Inverschluesseln
werden die Variablentext
undzeilen
nicht benutzt.
entschluesseln
gibt einendouble
zurück (wozu eigentlich?), hat aber keinreturn
.
main
mussint
zurückgeben.
Inmain
werden die Variablenklar
,geheim
,wahl1
undch
nicht benutzt.
Die Funktiongets
ist gefährlich und sollte nicht benutzt werden.Und das sind nur die Fehler die mir mein Compiler schon anmeckert. Über den Programmierstil (die einen nennen es 86%, ich nenne es Spagetticode) fange ich lieber gar nicht an.
Zur Funktion: Verschlüsseln geht bei mir nicht, weil der Dateiname zum speichern nicht abgefragt wird.
Entschlüsseln geht bei mir nicht, weil ein Segmentation fault verursacht wird. Dein Programm schreibt über die Arraygrenzen hinaus.Insgesamt
. Das kannst du bestimmt besser.
-
Ja es gibt garantiert bessere Möglichkeiten und garantiert noch viel zu verbessern, aber das Programm funktioniert bei mir genau so einwandfrei und verschlüsselt alles innerhalb des Alphabets mit Leerzeichen. Ich bin mit 86% also einer 2+ sehr zufrieden.
Ich Studiere ja auch kein Informatik sondern Assistive Technologien.Danke und Gruß
-
Gerade dann sollte man saubere Software schreiben :p
-
cooky451 schrieb:
Gerade dann sollte man saubere Software schreiben :p
Grade wann?
Ich nehm den Quelltext einfach wieder raus und gut ist. Es war nur nett gemeind für Nachfolgende...
-
Motors-Freak schrieb:
Ich nehm den Quelltext einfach wieder raus und gut ist. Es war nur nett gemeind für Nachfolgende...
Nein, lass bitte drin! Auch aus suboptimalen Quelltexten können Leser etwas lernen. Vermutlich sogar mehr als wenn du eine perfekte Lösung präsentiert hättest.
Man könnte auch jetzt im Rahmen des Threads versuchen den Code zu verbessern.
-
hallo kann mir jemand helfen diesen text zu lösen würde mich freuen
verstehe das nähmlich ncht und brauche as bis dienstag
wenn dasjeand mir gelöst schicke könnte wäre es prima.
wenn jemand das schicken kann bitte per e-mail. anna2609@freenet.dedas wäre der text:
frvG WnuEMruAGrA IrEunAqryA cByvGvxrE, sBEFpurA jvFFrAFpunsGyrE HAq qvFxHGvrErA xyHtr XöCsr üorE NHFJrtr nHF qrE XyvznxEvFr. QnFF rF AvpuG rvAsnpu FB JrvGrE trurA xnAA Jvr ovFurE, vFG vAMJvFpurA IvryrA xynE. XyvznFpuHGM vFG rvAr qrE JvpuGvtFGrA NHstnorA süE rvAr AnpuunyGvtr RAGJvpxyHAt qrE REqr. QrAA qvr IBA ZrAFpurA trznpuGr XyvznIrEäAqrEHAt orGEvssG HAF nyyr.
hAq XyvznFpuHGM säAtG FpuBA MH UnHFr BqrE vA qrE fpuHyr nA. Qvr NoFrAxHAt qrE enHzGrzCrEnGHE Hz AHE rvA TEnq FrAxG qvr Pb2-RzvFFvBArA rvArF 4-crEFBArA-UnHFunyGF CEB WnuE Hz EHAq 350 XvyBtEnzz. frAxG znA qvr grzCrEnGHE vA qrE anpuG vA qrE jBuAHAt trArEryy nHs 15-16 TEnq, FCnEG qnF ABpu rvAzny xAnCC 300 XvyBtEnzz Pb2 (QnGrADHryyr: TErrACrnpr). QnzvG AvrznAq sEvrErA zHFF, vFG rvAr BCGvznyr jäEzrqäzzHAt JvpuGvt. hAq trAnH qnEHz truG rF orv rHErE rEFGrA NHstnor!
RAGJvpxryG rvAr BCGvznyr jäEzrqäzzHAt nHF AnGüEyvpurA ZnGrEvnyvrA. OnHG rvArA VFByvrEoruäyGrE zvG rvArE vAABInGvIrA HAq öxByBtvFpurA jäEzrqäzzHAt, qrE Fvpu zvG rvArz Qrpxry össArA HAq FpuyvrßrA yäFFG. Vz VAArEA zHFF rvA OrpurE zvG JnEzrz jnFFrE cynGM unorA – qrA OrpurE orxBzzG vuE IBA HAF. RF xBzzG qnEnHs nA, qnFF Fvpu qnF JnEzr jnFFrE vAArEunyo IBA 45 ZvAHGrA FB JrAvt Jvr zötyvpu noxüuyG. VAsBEzvrEG rHpu orv rHErA YruErEA, FpunHG vA OüpurEA Anpu HAq AnGüEyvpu xöAAG vuE nHpu qnF VAGrEArG AHGMrA.
Qvr enAqorqvAtHAtrA:
• SüE qrA VFByvrEoruäyGrE qüEsG vuE AHE ZnGrEvnyvrA IrEJrAqrA, qvr vA qrE anGHE IBExBzzrA. QvrFr AnGüEyvpurA jrExFGBssr xöAAG vuE JrvGrEIrEnEorvGrA HAq zvGrvAnAqrE xBzovAvrErA. NHpu unAqryFüoyvpurE NyyrFxyrorE FBJvr cnCvrE (80 t/z²) qnEs IrEJrAqrG JrEqrA.
• QrE VFByvrEoruäyGrE qnEs oryvrovt trsBEzG FrvA, norE AvpuG tEößrE FrvA nyF rvA jüEsry zvG qrE XnAGrAyäAtr IBA 22 pz.
• Qvr trFnzGrA ZnGrEvnyxBFGrA qüEsrA rvArA OrGEnt IBA 20 € AvpuG üorEFpuErvGrA.
• OvGGr qBxHzrAGvrEG AvpuG AHE rHrE REtroAvF, FBAqrEA nHpu Jvr vuE qnMH trxBzzrA Frvq. QvrF xöAAG vuE FpuEvsGyvpu znpurA, zvG SBGBF BqrE qHEpu rvArA xHEMrA ivqrBsvyz (znK. 3 ZvAHGrA).Qvr OrJrEGHAtFxEvGrEvrA:
• QrE OrpurE JvEq zvG 200 zy jnFFrE trsüyyG, JrypurF rvAr grzCrEnGHE IBA 60° P unG. QnAA JvEq trzrFFrA, Hz Jrypur grzCrEnGHE Fvpu qnF jnFFrE vAArEunyo IBA 45 ZvAHGrA noxüuyG (znpuG 75 % qrE TrFnzGorJrEGHAt nHF).
• XErnGvIvGäG HAq bEvtvAnyvGäG qrE YöFHAt (M. O. orv qrE ZnGrEvnynHFJnuy) (10 %).
• QBxHzrAGnGvBA qrF REtroAvFFrF HAq qrE grnznEorvG (10 %).
• ernyvFvrEHAt zvG zötyvpuFG trEvAtrA ZnGrEvnyxBFGrA (5 %).Qvr NotnorsEvFG süE rHErA OruäyGrE HAq qvr QBxHzrAGnGvBA yäHsG nz QBAArEFGnt, 24. SroEHnE 2011, Hz 17.00 huE no. VuE xöAAG Fvr zvG qrE cBFG nA qvr HAGrA nAtrtrorAr NAFpuEvsG FpuvpxrA BqrE nHpu CrEFöAyvpu IBEorvoEvAtrA.
hAFrEr xBzCrGrAGr WHEL orFGruG H. n. nHF cEBsrFFBErA qrE UBpuFpuHyrA vz XErvF fBrFG HAq irEGErGrEA tEBßrE HAq xyrvArErE jvEGFpunsGFHAGrEAruzrA HAq JvEq nAunAq qrE OrJrEGHAtFxEvGrEvrA rAGFpurvqrA. VA qrE WHELFvGMHAt, norAqF nz 09.03.2011, JrEqrA nyyr OruäyGrE HAGrE tyrvpurA OrqvAtHAtrA trGrFGrG HAq qvr REtroAvFFr IrEtyvpurA.
bo vuE rvAr eHAqr JrvGrE Frvq BqrE AvpuG, xöAAG vuE nz AäpuFGrA BqrE üorEAäpuFGrA gnt nHs JJJ.trqnAxrAoyvGM-FpuHyJrGGxnzCs.qr BqrE vA qrE gntrFMrvGHAt AnpuyrFrA. jrE AvpuG FB ynAtr JnEGrA zöpuGr: QvErxG nHF qrE WHELFvGMHAt urEnHF tvoG rF ynHsrAq fGnGHFzryqHAtrA süE qrA TrqnAxrAoyvGM nHs SnproBBx BqrE gJvGGrE.
SüE eüpxsEntrA FGrur vpu rHpu trEA MHE irEsütHAt.
-
- Keine Eigeninitiative
- Plumpe Forderung
- Ergebnis noch nicht einmal im Forum diskutieren
Dafür aber:
- Weiblicher Nickname
Du hast alles richtig gemacht. Da wird ganz bestimmt jemand drauf reinfallen und dir deine Hausaufgaben machen
edit: Das ist ja sogar ROT13, der härteste aller Cäsarchiffres. Da hast du wiederum Pech, das wird bestimmt niemand bis Dienstag lösen können.