C++ Cäsar Chiffre programmieren

Ahoi, ich habemal eine kurze Frage. Ich bin gerade drann eine kleine Anwendung zu programmieren die einen Text mit dem Cäsar Chiffre chiffriert und dechiffriert. Das ganze läuft so ab, dass ich zwei ineinander verschachtelte Schleifen habe, die eine geht den String runter und die andere das Alphabet. In der zweiten ist dann eine Zweiseitige Auswahl die überprüft ob das Zeichen auf dem sich der Zeiger im String richtet gleich dem Alphabet ist. Falls ja wird das Stringzeichen durch einen anderen Buchstaben gewechselt. Klappt auch soweit ganz gut bis, dass ich kleine Leerstellen auslesen kann. Ich schreibe z.B. in den String "Super hoch geheime Nachricht". Und das Programm chiffriert nur "Super" ab da kommen nur noch komische Zeichen. Hoffe, dass mr jemand da weiterhelfen kann. Benutze Windows XP Prof. und Visual C++ 6.0 Prof.
 
Ahoi hab ma denn Code jetzt war übers WE weg. Ist aber nur die Verschlüsselung die aber auch irgendwie net klappt. Bleibt aber trotzdem die Frage wieso er die Leerzeichen nicht anzeigt.
Code:
#include <iostream>
using namespace std;

int main () {
	
	int zaehler1=1, zaehler2=1,ver_zahle,ver_zahlr;
	char eingabe[200], ausgabe[200],alphabet[53] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabzdefghijklmnopqrstuvwxyz";
	
	cout << "Bitte die Zahl eingeben um die verschoben werden soll: ";
	cin >> ver_zahle;
	
	cout << "Bitte die Nachricht eingeben (max. 200 Zeichen) \n";
	cin >> eingabe;

	while (zaehler1<200) {

		while (zaehler2<53) {

			ver_zahlr=zaehler2+ver_zahle;

			if (eingabe[zaehler1]==alphabet[zaehler2]) {
				
				ausgabe[zaehler1]=alphabet[ver_zahlr];}
			
			zaehler2++;

		}

		zaehler1++;
	}
	cout << ausgabe;
	return 0;
}
 
cin liest nur bis zum nächstens whitespace ein, d.h. bereits ein leerzeichen unterbricht das ganze. um eine ganze zeile einzulesen sei dir std::getline empfohlen. wenn du dann noch std::string anstelle deiner char-arrays nimmst, dann hast du auch kein problem mehr mit der länge. ein weiteres problem bei deinem code hier ist, dass die ausgabe wohl nicht mit '\0' terminiert ist, aber auch das problem wäre beseitigt, wenn du auf std::string umsteigst...
was du auf jeden fall noch machen musst, ist deine zählvariablen mit einem gültigen wert initialisieren. im moment steht da irgendwas drin, aber sicher nichts sinnvolles.
 
Was auch noch "korrigiert" werden sollte, ist die Verschiebungsvariable. Es sollte nicht möglich sein, um mehr als 25 Stellen zu verschieben (bei 26 wird "A"->"a", und mehr als 26 ergiebt keinen Sinn). Dann bei ver_zahlr kontrollieren, dass diese nicht grösser als 52 wird.
Nach eingabe der Verschiebung im Alphabet:
Code:
if (ver_zahle%26 == 0) {
    cout << "Ungültige Verschiebung!";
    return 0;            // Kannst natürlich auch eine Schleife programmieren, die so lange läuft, bis eine korrekte eingabe gemacht wird
}

for (;ver_zahle > 25; ver_zahle -= 26) { ; }
nach bestimmen von ver_zahlr:
Code:
if (ver_zahlr > 52)
    ver_zahlr -= 26;
 
Hallo Valentin!
Ich habe so ein Programm schon geschrieben, aber in stink normalen C.
Wenn du Interesse hast dir den Code mal anzuschauen kann ich ihn ja mal posten.
Gruß, Neo McNasty
 
So das ist mein Programm:
Es liest den Inhalt einer Textdatei aus, die man angeben kann und schreibt diesen um den ebenfalls angegebenen Schlüssel verschoben in eine weitere Textdatei.
Es können negative sowie positive Schlüssel zw. -25 und +25 angegeben werden.
Um die verschlüsselte Datei zu entschüsseln muss man einfach den Schlüssel mit umgekehrtem Vorzeichen angeben.

Code:
/*
	Projekt: Programm zum (de)chiffrieren von Textdateien
	Autor: Thomas Krug
*/

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>


FILE *lesen, *schreiben;
char dateiname_eingabe[256], dateiname_ausgabe[256];
char zeichen;
int schluessel;

int main()
{
	int lauf=0;

	printf("\n\tProgramm zum (de)chiffrieren von Textdateien");
	printf("\n\t____________________________________________\n\n");

	while(lauf==0)
	{
		printf("\nInputdatei: ");
		scanf("%s",&dateiname_eingabe);

		lesen=fopen(dateiname_eingabe,"r");

		if(lesen==NULL)
			printf("\nFehler beim Oeffnen der Datei!");


		else
			lauf=1;
	}
	lauf=0;

	while(lauf==0)
	{
		printf("\nOutputdatei: ");
		scanf("%s",&dateiname_ausgabe);

		schreiben=fopen(dateiname_ausgabe,"w");

		if(schreiben==NULL)
			printf("\nFehler beim Erstellen der Datei!");

		else
			lauf=1;
	}
	lauf=0;

	while(lauf==0)
	{
		printf("\nSchluessel (zum dechiffrieren negativen Schluessel angeben): ");
		scanf("%i",&schluessel);

		if((schluessel<-25)||(schluessel>25))
			printf("\nBitte geben Sie einen Schluessel im Bereich von -25 bis 25 an!");

		else
			lauf=1;
	}
	lauf=0;

	while(zeichen!=EOF)
	{
		zeichen=fgetc(lesen);

		//Zahlen
		if((zeichen>47)&&(zeichen<58)&&((zeichen+schluessel)<58)&&((zeichen+schluessel)>47))
			fputc(zeichen+schluessel, schreiben);

		else if((zeichen>47)&&(zeichen<58)&&((zeichen+schluessel)>57))
			fputc(zeichen+schluessel+47-57, schreiben);

		else if((zeichen>47)&&(zeichen<58)&&((zeichen+schluessel)<48))
			fputc(zeichen+schluessel-47+57, schreiben);

		//Grossbuchstaben
		else if((zeichen>64)&&(zeichen<91)&&((zeichen+schluessel)<91)&&((zeichen+schluessel)>64))
			fputc(zeichen+schluessel, schreiben);

		else if((zeichen>64)&&(zeichen<91)&&((zeichen+schluessel)>90))
			fputc(zeichen+schluessel+64-90, schreiben);

		else if((zeichen>64)&&(zeichen<91)&&((zeichen+schluessel)<65))
			fputc(zeichen+schluessel-64+90, schreiben);

		//Kleinbuchstaben
		else if((zeichen>96)&&(zeichen<123)&&((zeichen+schluessel)<123)&&((zeichen+schluessel)>96))
			fputc(zeichen+schluessel, schreiben);

		else if((zeichen>96)&&(zeichen<123)&&((zeichen+schluessel)>122))
			fputc(zeichen+schluessel+96-122, schreiben);

		else if((zeichen>96)&&(zeichen<123)&&((zeichen+schluessel)<97))
			fputc(zeichen+schluessel-96+122, schreiben);

		//sonstige Zeichen
		else
			fputc(zeichen, schreiben);
	}

	fclose(lesen);
	fclose(schreiben);
}

Die Umwandlung in ein C++ Programm dürfte ja kein Problem darstellen.
Gruß, Neo McNasty
 
Zurück
Oben