//  Hörsaalübung - Caesar Verfahren
//
//  B.Herth
//
//  Das Program fragt nach einem Schlüssel (int Wert) und anschliessend
//  nach einer Textzeile. Diese wird durch die Funktion encrypt nach dem
//  Ceasar Verfahren verschlüsselt
//
#include <iostream>    
using namespace std;

//
// Funktions Prototypen
//
int encrypt ( const char *in, char *out , int k );   

//
// Zur Vereinfachung alles im Hauptprogramm
//
void main()
{
	unsigned int key;                   // Schlüssel zur Verscheibung
	cout <<"Bitte Key eingeben :";
	cin >> key;

	key = key %26;                      // Normieren auf die 26 Buchstaben  A-Z
	cin.ignore(256,'\n');				// Löschen der restlichen Zeichen im
										// Eingabepuffer (Problem beim Wechsel von
										// cin >> und cin.getline()

	char Klartext[256];            // Maximal 256 Buchstaben
    char Geheimtext[256];

	//
	//  Einlesen der Textzeile
	//
	cout << endl << "Bitte Klartext eingeben :";
	cin.getline(Klartext,256);               // cin.getline setzt automatisch 0 als letzten Wert
                                            // Kraltext[n] = 0  

    //
	// Aufruf der Verschlüsselungsfunktion
	//
	encrypt ( Klartext , Geheimtext , key);

	//
	// Ausgabe des Geheimtextes
	//
	cout << "Hier ist der Geheimtext :" << Geheimtext <<endl;    
	

}
//
// Funktion encrypt()
// Parameter:	const char *in  - Zeiger auf Klartext
//				char *out       - Zeiger auf Geheimtext
//              int k           - Schlüssel
// Return:      int				- Zahl der verschlüsselten Zeichen
//
// Besonderheiten:
//   Es werden nur die Buchstaben A-Z oder a-z verschlüsselt
//   Der Schlüssel muss zwischen 0 und 25 liegen
//   
int encrypt ( const  char *in ,  char *out , int k)
{
	char *pout = out;
    // 
    // Hierbegint die Hauptschleife
    //
	while (unsigned char c = *in)           // Wichtig unsigned int Zwischenvariable
	{
		if ( c >= 'A'  &&   c <= 'Z' )      // Grossbuchstaben
		{
			c = c + k;
			if (c > 'Z') c = c - 26;        // Überläufer abfangen
		}

		if ( c >= 'a'  &&   c <= 'z' )      // Kleinbuchstaben
		{
			c = c + k;
			if (c > 'z') c = c - 26;        // Überläufer abfangen
		}

		*pout = c;                          // Speichern des Geheimtextes
		pout++;								// Schreibmarke erhöhen
        in++;								// Lesemarke erhöhen
	}

	*pout = 0;

    return int(pout-out);
}
