Caesar Verschlüsselung. Allgemeine Verschlüsselung.
-
Vergiss meinen Post, das war Blödsinn. Versuch's lieber so:
#include <stdio.h> int main(void) { char klar[5]; char geheim[5]; int i; printf("Bitte geben sie den Klartext ein: \n"); gets(klar); for(i=0; klar[i]; i++) { geheim[i]=klar[i]+1; } geheim[i] = 0; printf("%s\n",geheim); }
Was gets() angeht, hat SeppJ völlig recht, dir davon abzuraten.
-
@mngbd: Dein korrekter Quelltext funktioniert auch nichtm bringt trotzdem noch Müll auf den Schirm,...
@SeppJ: Ja er bringt eine Warnmeldung, aber ich kenne keine andere Lösung. Scanf fällt hier ja auch weg und bei scnaf zeigt er auch eine Warnmeldung!
Und wieso anstatt
i<5
das:
klar[i]
Danke!
-
Gib mal ein Wort mit 4 Buchstaben ein
-
Klappt danke
Aber ich kann es nicht ganz nachvollziehen!Warum "klar[i]" anstatt "i<5" und warum kann ich einen Array wo 5 Ziffern rein gehen mit nur 4 füllen? Weil der letzte mit '\0' gefüllt ist?
Danke!
-
Bei Zeichenketten in C wird das Ende immer durch ein Nullzeichen markiert. Dies musst du verinnerlichen, wenn du in C mit Zeichenketten jemals was funktionierendes Programmieren willst. Hol dir am besten ein gutes
Buch in dem das erklärt wird, ein kleiner Forenbeitrag reicht da nicht.
Mit diesem Wissen ist es leicht deine zwei Fragen zu beantworten:
Warum "klar[i]" anstatt "i<5"?
Woher willst du wissen, dass deine Zeichenkette genau 5 Zeichen lang ist? Das Nullzeichen markiert das Ende, also gehst du so lange durch, bis du bei einem Nullzeichen ankommst.
warum kann ich einen Array wo 5 Ziffern rein gehen mit nur 4 füllen? Weil der letzte mit '\0' gefüllt ist?
Ja, deswegen.
-
Motors-Freak schrieb:
und warum kann ich einen Array wo 5 Ziffern rein gehen mit nur 4 füllen? Weil der letzte mit '\0' gefüllt ist?
Genau.
Motors-Freak schrieb:
Warum "klar[i]" anstatt "i<5"
i<5 ist eine Bedingung. Wenn die Bedingung wahr ist, ergibt sie einen Wert ungleich 0.
Also 0 ist unwahr (falsch, nicht richtig) und ungleich 0 ist wahr (richtig).
Da das letzte Zeichen im String 0 ist, ist an dieser Stelle die Bedingung unwahr und die Schleife ist zu Ende.
mngbd hätte auch ;klar[i] != 0; schreiben können (was sicher lesbarer ist, aber keine Nachteile hat
)
Das ist besser als i<5, falls du mal weniger als 4 Zeichen eingibst oder das Feld nicht 5 sonder z.B. 500 Zeichen Platz bietet.
-
Moin :xmas1:
#include <stdio.h> #include <stdlib.h> #include <string.h> int encode(char *dest, char *source, int len, int shift) { int i; if (shift <= 0) // weil wegen sicherheit ;) { return 0; } shift = shift % 26; // weil wegen sonntag for (i = 0; i < len; i++) { if (source[i] >= 'A' && source[i] <= 'Z') dest[i] = 'A' + ((source[i] + shift - 'A') % 26); // 'A' + stelle im alphabet else if (source[i] >= 'a' && source[i] <= 'z') dest[i] = 'a' + ((source[i] + shift - 'a') % 26); // man muss hier leider etwas tricksen else // da zB. 'z'+5 kein buchstabe mehr wär dest[i] = source[i]; // wir verändern nur buchstaben } dest[i] = 0; // '\0' müssen wir manuell einfügen return i; // i sollte jetzt > 0 sein ;) } int main() { char buffer[0x100]; char encoded[0x100]; int shift = 0; printf("Caesar-encryption\n"); while (shift <= 0) // man könnte hier auch gleich auf <= 26 prüfen.. { // aber ich rechne ja eh shift % 26. printf("Please enter shift: "); fgets(buffer, sizeof(buffer), stdin); // fgets um anzahl der einzulesenden zeichen kontrollieren zu können shift = atoi(buffer); // string zu int } printf("Please enter your text:\n"); fgets(buffer, sizeof(buffer), stdin); buffer[strlen(buffer) - 1] = 0; // eingelesendes '\n' los werden if (encode(encoded, buffer, strlen(buffer), shift)) //encode gibt true zurück wenn erfolgreich printf("encoded:\n%s", encoded); else printf("Error!"); getchar(); return 0; }
Könnte man bestimmt auch wunderbar mit
char big_lib[] = "ABCDEFGH .."; char small_lib[] = "abcdefgh ..";
sowas lösen
-
cooky451 schrieb:
printf("Please enter shift: "); fgets(buffer, sizeof(buffer), stdin); // fgets um anzahl der einzulesenden zeichen kontrollieren zu können shift = atoi(buffer); // string zu int
Manchmal frage ich mich ob ich irgendeinen tollen Trick nicht sehe oder ob etwas einfach nur dumm ist. So auch hier. Warum nicht direkt eine Zahl einlesen?
-
SeppJ schrieb:
cooky451 schrieb:
printf("Please enter shift: "); fgets(buffer, sizeof(buffer), stdin); // fgets um anzahl der einzulesenden zeichen kontrollieren zu können shift = atoi(buffer); // string zu int
Manchmal frage ich mich ob ich irgendeinen tollen Trick nicht sehe oder ob etwas einfach nur dumm ist. So auch hier. Warum nicht direkt eine Zahl einlesen?
Weil ich scanf() nicht mag?
-
Was ist eigendlich an scanf so böse?
Habe das nun schon öfters hier gelesen, daß scanf nicht so toll ist.
Was ist denn so problematisch daran?Gruß,
DC
-
Don Carsto schrieb:
Was ist eigendlich an scanf so böse?
Habe das nun schon öfters hier gelesen, daß scanf nicht so toll ist.
Was ist denn so problematisch daran?Gruß,
DCAn und für sich ist scanf() nicht böse.
Nur muss man beim Gebrauch aufpassen.char buffer[10]; scanf("%s", buffer);
Das wäre zB. ein typischer Fehler. Abgesehen davon dass undefiniertes Verhalten erzeugt wird falls mehr als 9 Zeichen eingegeben werden könnte man auch noch recht einfach einen exploit für ein Programm schreiben das etwas so einliest. (siehe http://de.wikipedia.org/wiki/Pufferüberlauf )
Das gilt aber für alle C-Funktionen (man möge mich schelten falls ich jetzt was falsches schreibe :D). C-Funktionen überwachen nunmal von selbst keine Speicherbereiche. So kann
char buffer[10]; fgets(buffer, 100, stdin);
genauso für einen exploit genutzt werden, nur ist scanf() besonders bei Anfängern die sich hier noch keine Gedanken machen als quasi-Gegenstück zu printf() sehr beliebt und wird somit halt oft "falsch" benutzt. (Viele vergessen beim einlesen von Zahlen auch gerne mal den Adressoperator..)
Dabei wohnt scanf() aber wie schon gesagt das Böse eigentlich nicht inne und kann in dieser Form:int num; char buffer[10]; scanf("%i", &num); scanf("%9s", buffer);
auch problemlos genutzt werden.
Ich mag es halt nur nicht weils sich auf der Konsole komisch verhält aber das ist ne andere Geschichte und auch nur eine persönliche Meinung :xmas1:
-
Hallo
Habe zur Zeit ein kleines Problem. Bin immer noch an meinem verschlüsselungs Programm bei.
Mein Problem Zur Zeit ist, dass ich NICHT in einer IF Anweisung das GETS benutzen kann. Genauso wenig NACH einer IF Anweisung. Das Programm überspringt dann alles und wartet gar nicht auf eine Eingabe, wieso nich? Benutze ich das GETS jedoch vor der ersten IF Anweisung funktioniert es Einwandfrei. In Der IF Anweisung oder danach funktioniert es nicht mehr. Wieso?Gruß
-
Weil deine If Anweisung es verhindert, daß dein Code ausgeführt wird, sprich die if Anweisung ist nicht wahr.
Und ohne Codebeispiel ist es geradezu unmöglich zu sagen warum genau.
-
Die Funktionen kopiere ich jetzt mal nicht mit rein.
void main() { char klar[501]; char geheim[501]; char text[501]; int i; int wahl1=0; int wahl2=0; int a=0; int TEST=0; printf("========================================\n"); printf("= Caesar-Verschluesselung =\n"); printf("========================================\n\n"); nochmal: printf("Bitte waehlen Sie, ob sie einen Text eingeben wollen[1], oder ob Sie einen Text\naus einer Datei laden moechten[2]: \n"); scanf("%i",&wahl1); if(wahl1==1 || wahl1==2) { if(wahl1==1) { printf("Bitte geben sie den Text ein (Max. 500 Zeichen): \n"); gets(text); printf("\nIhr Satz besteht aus %i Zeichen.\n",strlen(text)); } else { printf("...kommt noch...\n"); } } else { printf("\nE R R O R\n\n"); goto nochmal; } /* printf("Bitte geben sie den Text ein (Max. 500 Zeichen): \n"); gets(text); printf("\nIhr Satz besteht aus %i Zeichen.\n",strlen(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; } }
-
if(wahl1==1 || wahl1==2)
Format ändern in:
if((wahl1==1) || (wahl1==2))
Also mehr Klammern.
-
Springt trotzdem drüber, erlaubt also keine Texteingabe...
-
Ja er überspringt das gets() weil da noch ein \n im Puffer ist.
Das kannste abfangen indem du ein getchar(); hinterschaltest.
if(wahl1==1) { getchar(); printf("Bitte geben sie den Text ein (Max. 500 Zeichen): \n"); gets(text); printf("\nIhr Satz besteht aus %i Zeichen.\n",strlen(text));
-
Oder arbeite auch bei den weiteren Texteingaben mit scanf().
-
Don Carsto schrieb:
Oder arbeite auch bei den weiteren Texteingaben mit scanf().
Aber mit Scanf kann ich doch keine Sätze aufnehmen, da scanf doch nur bis zu einem Leerzeichen Scant oder nicht???
-
Stimmt.