Zeichen in arry verändern
-
nwp2 schrieb:
Alternativ programmiere schlampig wie es hier als schön empfunden wird und mache dir ein char encrypted[123] als globale Variable wo du dann den Text reinschreibst, dann sparst du dir das malloc, das free und das zurückgeben.
Wer (außer vielleicht fricky, aber der lebt eh am Rande der Zurechnungsfähigkeit ;)) empfindet denn sowas als schön? Aber ansonsten bin ich ja schon sehr zufrieden, dass du dem OP nicht vorschlägst alles in Listen^^^äh Buffern abzulegen
-
nwp2 schrieb:
Alternativ programmiere schlampig wie es hier als schön empfunden wird und mache dir ein char encrypted[123] als globale Variable wo du dann den Text reinschreibst, dann sparst du dir das malloc, das free und das zurückgeben.
naja, seine 'verschlüsselung' (ist aber anderes diskussionsthema) erzeugt einen output, der ebenso lang ist wie der plaintext und arbeitet mit nullterminierten strings. in dem fall ist überhaupt kein 'malloc' nötig. vom prinzip her also so:
void encypt (char *in, char *out) { while (*in) { *out = encrpyt_char(*in); // verschlüsselt ein zeichen in++; out++; } }
^^alternativ könnte man eine funktion schreiben, die auch mit nicht-nullterminierten char-arrays klar kommt (d.h. länge übergeben). das hat mit schlampigkeit nix zu tun. diese funktion könntest du z.b. auch von einer anderen verwenden, die das ziel-array per 'malloc' anlegt *fg*
nwp2: in vielen umgebungen, in denen C verwendet wird, gibt es überhaupt kein 'malloc', oder sein einsatz ist verboten bzw. nur sehr eingeschränkt möglich. was machst du dann? malloc und co. sind oft keine option, denn sie sind verhältnismässig lahm und können fehlschlagen. also komm mal von diesem trip runter oder mach gleich C++ *fg*
Tim schrieb:
...außer vielleicht fricky, aber der lebt eh am Rande der Zurechnungsfähigkeit..
du verwechselst mich mit volkard.
-
Sunny31 schrieb:
Huhu,
du brauchst nichts zurückgeben, wenn du den C-String per Parameter an die Funktion übergibst. Da spricht man nämlich von 'Call by Reference'.
void Encrypt ( char* PlainText ) { // DoSomething() ; }
ich versteh nicht ganz was du meinst
char key[10]; char text[100]; int _tmain(int argc, _TCHAR* argv[]) { int z,i,e; printf("Geben Sie bitte ihren Schluessel ein: "); gets_s(key); printf("(1) Verschluesseln"); printf("(2) Entschluesseln"); scanf("%d",&e); switch (e){ case 1: //funktion die verschlüsselt break; case 2: //funktion die entschlüsselt break; } //verschlüsselungsfunktion printf("Bitte geben Sie den Text ein, der verschluesselt werden soll: \n"); gets_s(text); for(z=0;key[z] != '\0';z++); for (i=0;text[i]!= '\0';i++){ text[i]=text[i]+z;} return (....) //hier soll er das arry "text" zurück an die main geben, damit man es dort ausgeben kann mit printf. das gleich soll in einer funktion fürs entschlüsseln geschehen
-
cs-loader schrieb:
Sunny31 schrieb:
Huhu,
du brauchst nichts zurückgeben, wenn du den C-String per Parameter an die Funktion übergibst. Da spricht man nämlich von 'Call by Reference'.void Encrypt ( char* PlainText ) { // DoSomething() ; }
ich versteh nicht ganz was du meinst
er meint damit, dass du den string auch in-place 'verschlüsseln' kannst. call by reference heisst, du übergibst einen verweis auf den string, nicht den string selbst (hinweis für etwaige nachfragen: die adresse des strings wird als kopie übergeben. das ist mir klar). nachteil einer in-place manipulation: der string muss lesbar *und* beschreibbar sein und du zerstörst das original dabei.
-
habe einfach das mit den einzelnen funktionen sein gelassen. nun habe ich aber das nächste Problem.
Wenn ich das folgende programm starte, dann bricht er bei "gets_s(text);" einfach ab, ich sehe das printf und sobald ich eine taste drücke schließt sich das Programm. glaube das hat was mit dem scanf oben zu tun, wenn das weg ist gehts. wie kann ich das ändern?char key[10]; char text[100]; int z,i,e=0; int _tmain(int argc, _TCHAR* argv[]) { printf("Geben Sie bitte ihren Schluessel ein: "); gets_s(key); for(z=0;key[z] != '\0';z++); printf("(1) Verschluesseln\n"); printf("(2) Entschluesseln\n"); scanf("%d",&e); switch (e){ case 1: printf("Bitte geben Sie den Text ein, der verschluesselt werden soll: \n"); gets_s(text); //Hier for (i=0;text[i]!= '\0';i++){ text[i]=text[i]+z; } break; case 2: printf("Bitte geben Sie den Text ein, der entschluesselt werden soll: \n"); gets_s(text); //oder hier for (i=0;text[i]!= '\0';i++){ text[i]=text[i]-z; } break; } printf("%s\n",text); _getch(); return 0; }
-
Huhu,
du benutzt gets_s falsch.
char str[100] ; gets_s ( str, 99 ) ;
gets_s ist doch VC++ Müll. Benutz fgets.
char str[100] ; fgets ( str, 100, stdin ) ;
-
also ich habe es nun mit
fgets(text, 100, stdin );
und
gets_s(text,99);
versucht. aber er bricht immer noch einfach an der im obigen post gekennzeichneten stelle ab.
Woran liegt das?
-
gegenspammer schrieb:
ich hab folgende Aufgabe bekommen:
Schreiben Sie ein Programm zum Verschlüsseln bzw. Entschlüsseln von
Textdateien. Die Verschlüsselung wird erreicht, indem jeder Buchstabe im
Bereich a-z und A-Z um einen "geheimen" Wert verschoben wird. Das heißt zum
Beispiel für eine Verschiebung um 5 für das Wort "Atom" eine Verschlüsselung
nach "Fytr". Die Verschiebung ist zyklisch, d.h. z um den Wert 1 verschoben
ergibt a. Das Programm wird mit einem Parameter -v (zum Verschlüsseln) oder -e
(zum Entschlüsseln) und dem Namen der Textdatei parametrisiert. Der "geheime"
Wert der Verschiebung ist als Konstante fest in das Programm zu integrieren. Die
Zieldatei hat den gleichen Namen wie die Originaldatei, die zu löschen ist.scheint so als hätten mehr die aufgabe;)
schau doch mal hier http://www.c-plusplus.net/forum/viewtopic-var-t-is-257425.html da könnt ja auch was für dich dabei sein
-
so ich habe nun das Problem mit dem abbruch hinbekommen.
nun würde ich gerne das ver- und entschlüsseln in eine funktion packen.
wie gebe ich den string oder pointer genau zurück und wie sieht der prototyp der funktion aus?
-
void verschluesseln(char *s); //wenn du die Eingabe mit dem neuen überschreibst char *verschluesseln(const char *s); //wenn du die Eingabe unverändert lässt und den verschlüsselten Text zurückgibst
Bei der ersten Version gibst du garnichts zurück sondern schreibst einfach in s deinen verschlüsselten String rein. Bei der zweiten Version besorgst du dir mit malloc Speicher, wahrscheinlich char *verschluesselterText = malloc(strlen(s)+1); und gibst dann mit return verschluesselterText; den Text zurück nachdem du ihn gefüllt hast. Vergiss das String-Ende-Zeichen '\0' nicht.
-
nwp2 schrieb:
void verschluesseln(char *s); //wenn du die Eingabe mit dem neuen überschreibst char *verschluesseln(const char *s); //wenn du die Eingabe unverändert lässt und den verschlüsselten Text zurückgibst
und noch:
int encrypt (char *in, char *out);
^^ wenn das ergebnis des zu verschlüsselnden strings ('in' zeigt auf ihn), dorthin abgeladen werdebn soll soll, wohin 'out' zeigt. rückgabewert der funktion ist der status der umwandlung (hat geklappt, fehlercode, abbruch wegen..., usw...).