Caesar Verschlüsselung
-
Hey Leute,
ich bin neu im Forum und hab gleich mal ein Problem mit C ^^
Ich hab die AUfgabe gestellt bekommen, die Caesar Verschlüsselung als ALgorithmus umzusetzen und das klappt auch ganz gut allerdings gibt es noch einenFehler, den ich nicht reproduzieren kann.
Wenn ich nun ein Wort Verschlüsseln möchte und alles Daten angebe spuckt die Konsole mehr aus als sie soll!
Mal ein Beispiel:
Ich möchte "HALLO" mit dem Schlüssel 3 chiffrieren, das klappt so weit ausgegeben wird "MFQQT" aber wenn ich nun z.B "HHALLOOO" mit dem gleichen Schlüsselchiffriere spuckt die Konsole hinter dem codierten Wort noch viele immer zufällige Sonderzeichen aus z.B "MMFQQTTT!?:D>3!"
Sie zeigt sogar Smileys an und ich weiß nicht wieso#include <stdio.h> #include <strings.h> #include <malloc.h> char *chiffre(char text[],int schluessel, int richtung) { int i; char *str; str = malloc((strlen(text)+1)*sizeof(char)); switch(richtung) { case 1: { for(i=0;text[i]!='\0';i++) { if(text[i] == '\n')str[i] = text[i]; else if(text[i] != 32) { if(text[i]+schluessel>90) { str[i] = 65 + (text[i]+schluessel-90-1); } else str[i] = text[i] + schluessel; } else str[i] = text[i]; } break; } case -1: { for(i=0;text[i]!='\0';i++) { if(text[i] == '\n')str[i] = text[i]; else if(text[i] != 32) { if(text[i]-schluessel<65) { str[i] = 90 + (text[i]-schluessel-65+1); } else str[i] = text[i] - schluessel; } else str[i] = text[i]; } break; } } str[i] = '\0'; return str; } int main() { char text[256]; int richtung,schluessel; printf("Geben Sie ihren Text ein: "); gets(text); scanf("%d",&richtung); scanf("%d",&schluessel); printf("%s",chiffre(text,schluessel,richtung)); return 0; }
Schonmal DANKE!
-
Da fehlt die abschließende
0
.MrMonkey schrieb:
string = malloc(strlen(text)*sizeof(char)); string = chiffre(text,schluessel,richtung);
really? Wer gibt den Speicher frei?
-
Zeile 59 ist Unfug. Du reservierst Speicher verwirfst aber sofort den Zeiger in der nächsten Zeile.
Zeile 9 ist Dein Problem. Du reservierst 1 Byte zu wenig. Du brauchst auch Platz für das abschließende 0 Byte.
Vor Zeile 47 mußt Du das 0 Byte schreiben.
str[i]=0;
Vor Zeile 62 solltest Du den Speicher wieder freigeben.
free(string);
Nachtrag: sizeof(char) ist immer 1
-
Swordfish schrieb:
really? Wer gibt den Speicher frei?
Es ist vom C-Standard garantiert, dass der Speicher nach Beenden des Programmes automatisch freigegeben wird. Also kein Grund zur Panik.
-
cstandardkenner schrieb:
Swordfish schrieb:
really? Wer gibt den Speicher frei?
Es ist vom C-Standard garantiert, dass der Speicher nach Beenden des Programmes automatisch freigegeben wird. Also kein Grund zur Panik.
Trotzdem sollte man sich sowas nicht angewöhnen.
-
Danke, war echt doof von mir das letzte "Zusatzbyte" nit zu berücksichtigen, hab ich glatt vergessen
Jetzt funktioniert alles.Ich hab im Startbeitrag nochmal editiert, wie es jetzt aussieht, falls noch jemandem etwas sehr unnützes oder ungebräuchliches auffällt, sagt Bescheid
//erledigt Danke! Auch für die Tipps wegen dem Speicher
-
cstandardkenner schrieb:
Swordfish schrieb:
really? Wer gibt den Speicher frei?
Es ist vom C-Standard garantiert, dass der Speicher nach Beenden des Programmes automatisch freigegeben wird.
Das ist garantiert nicht garantiert.
Manche Betriebssysteme (das sind vor allem die derzeit üblichen Desktop- und Workstationsysteme) garantieren, dass sie Speicher* hinter dem Programm aufräumen.
*: Aber selten/nie andere Ressourcen. Eventuell noch Dateien, bei denen aber bereits vom C-Standard unter gewissen Umständen (aber nicht allen!) garantiert wird, dass sie geschlossen werden. Da man bei allen Arten von Ressourcen die gleichen Schemata nutzt, um ihre Reservierung und Freigabe zu gewährleisten, ist es eine gute Idee, es am Speicher zu üben, wo die Konsequenzen eines Fehlers nicht ganz so fatal sind (zumindest, wenn man auf einem der Systeme arbeitet, die hinter einem aufräumen).
-
cstandardkenner schrieb:
Swordfish schrieb:
really? Wer gibt den Speicher frei?
Es ist vom C-Standard garantiert, dass der Speicher nach Beenden des Programmes automatisch freigegeben wird. Also kein Grund zur Panik.
Gut, daß es die Unregistrierter-Version von c-plusplus.net gibt. Da muss man sich keinen Kopf um "da hab ich wohl Quatsch behauptet" machen.
Meine Erfahrungen sind eher "detected memory leaks" und sowas wenn du nicht immer und überall ein free nach einem malloc machst. Gleiches gilt für new und delete in C++.
Es liegt in deiner Verantwortung angeforderten Speicher auch wieder ordentlich zurückzugeben. Ist ja schließlich nicht Java - eine Programmiersprache für Nichtprogrammierer.