#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>
using namespace std;

bool isLonger(string first, string second) 
{
    return first.size() > second.size();
}
string Text(string Eingabe)
{
	cout << "Geben Sie einen Text ein\n";
	getline(cin, Eingabe);

	return Eingabe;
}
int main()
{
	int number_1;

	do
	{
		cout << "Was wollen Sie tun?\n";
		cout << "(1) String anschauen\n";
		cout << "(2) Char   anschauen\n";
		cout << "(0) Exit\n";
		cin  >> number_1;

		switch(number_1)
		{
		case 1:
			{
				cout << "Sie haben sich dazu entschieden, einen String anzusehen!\n";
				cout << "\n";
				int number_2;
				do
				{
					cout << "Was wollen Sie anschauen?\n";
					cout << "(01) Passwortabfrage\n";
					cout << "(02) Die Laenge zweier Strings miteinander vergleichen\n";
					cout << "(03) Stringlaenge anhand von Buchstaben berechnen\n";
					cout << "(04) Strings addieren\n";
					cout << "(05) String Anfang und Ende ermitteln\n";
					cout << "(06) Groesse eines Strings ermitteln\n";
					cout << "(07) Refernz auf String\n";
					cout << "(08) Operator +=\n";
					cout << "(09) 5 Saetze ausgeben\n";
					cout << "(00) Zurueck\n";
					cin  >> number_2;

					switch(number_2)
					{
					case 1:
						{
							string e;
							e = "Maximilian*Maximilian";

							cout << "\n";
							cout << "\t Menuepunkt(01) Passwortabfrage!\n";
							cout << "\n";

							do
							{ 
								cout << "Wie lautet das Passwort?\n";
								cin  >> e;
								if(e=="Maximilian*Maximilian")
									cout << "Richtig eingegeben";
								else
									cout << "Nicht richtig eingegeben!\n";
							}while(e!="Maximilian*Maximilian");

							break;
						}
					case 2:
						{
							cout << "\tMenuepunkt(02) Die Laenge zweier Strings miteinander vergleichen\n";
							string erste;
							cin >> erste;
							string zweite;
							cin >> zweite;
							if(isLonger(erste,zweite))
								cout << "Der erste ist länger";
							else
							cout << "Der zweite ist länger";
							break;
						}
					case 3:
						{
							cout << "\tMenuepunkt(03) Stringlaenge anhand von Buchstaben berechnen\n";
							string str;

							cout << "Bitte geben Sie einen Text ein!\n";
							getline(cin, str);

							cout << "Ihr Text hat " << str.size() << " Buchstaben\n";
							break;
						}
					case 4:
						{
							cout << "\tMenuepunkt(04) Strings addieren\n";
							string Text_1, Text_2, Text_3;

							cout << "Geben Sie die erste Haelfte des Satzes ein:\n";
							getline(cin, Text_1);

							cout << "Geben Sie die zweite Haelfte des Satzes ein:\n";
							getline(cin, Text_2);

							Text_3 = Text_1 + Text_2;

							cout << "Zusammengefuegt heisst der Satz:\n";
							cout << Text_3;
							break;
						}
					case 5:
						{
							cout << "\tMenuepunkt(05) String Anfang und Ende ermitteln\n";
							
							string str("Test string");
							string::iterator it;

							for (it=str.begin(); it < str.end(); it++)
							cout << *it;
							
							break;
						}
					case 6:
						{
							cout << "\tMenuepunkt(06) Groesse eines Strings ermitteln\n";
						
							string Text;
							cout << "Geben Sie einen Text ein!\n";
							cin  >> Text;
	
							cout << sizeof(Text) << "\n";
							cout << "Groesse:\t " << Text.size() << "\n";
							cout << "Laenge:\t" << Text.length ()<< "\n";
							cout << "Kapazitaet:\t" << Text.capacity() << "\n";
							cout << "Max. Laenge:\t" << Text.max_size() << "\n";

							break;
						}
					case 7:
						{
							cout << "Menuepunkt(07) Refernz auf String\n";
							
							string Eingabe;
							string &Text_1 =Text(Eingabe);
							cout << Text_1 << "\n";
							
							break;
						}
					case 8:
						{
							cout << "Menuepunkt(08) Operator +=\n"; 

							string Vorname;
							string Familienname;

							cout << "Geben Sie Ihren Vornamen ein: \n";
							getline(cin, Vorname);

							cout << "Geben Sie Ihren Familiennamen ein: \n";
							getline(cin, Familienname);

							Vorname += Familienname;
							Vorname += '\n';

							cout << Vorname << "\n";

							break;
						}
					case 9:
						{
							cout << "Menuepunkt(09) 5 Saetze ausgeben\n";
							string Satz[5];

							cout << "Geben Sie fuenf Saetze ein!\n";

							for (int i=0; i<5; i++)
							{
								cout << "Satz[" << i <<"]: ";
								getline(cin, Satz[i]);
							}

							cout << "\n";
							cout << "Das haben Sie eingegeben: \n";
							cout << "\n";

							for (int i=0; i<5; i++)
							{
								cout << "Satz[" << i << "]: " << Satz[i] << "\n";
							}

							cout << "\n";
							break;
						}
					case 0:
						{
							cout << "Menuepunkt Zurueck\n";
							break;
						}
					}
				}while(number_2!=0);
				break;
			}
		case 2:
			{
				cout << "Sie haben sich dazu entschieden, einen Char anzusehen!\n";
				cout << "\n";
				int number_3;
				do
				{
					cout << "Was wollen Sie anschauen?\n";
					cout << "(01) Funktion strrchr\n";
					cout << "(02) Funktion strchr\n";
					cout << "(03) Suche nach einem Buchstaben in einem Satz\n";
					cout << "(04) Funktion getline\n";
					cout << "(05) Funktion putback\n";
					cout << "(06) Funktion put(char)\n";
					cout << "(07) Funktion strstr() bzw. die Suche nach Woertern in einem Text\n";
					cout << "(00) Zurueck\n";
					cin  >> number_3;

					switch(number_3)
					{
					case 1: 
						{
							cout << "Menuepunkt (01) Funktion strrchr\n";
							char str []= "Das ist ein einfacher string.\n";
							char * pstr;

							cout << str;

							pstr = strrchr(str,'s');

							cout << "Letzte Stelle von 's' wurde gefunden an " << pstr-str+1 << " \n";
							break;
						}
					case 2:
						{
							cout << "Menuepunkt (02) Funktion strchr\n";

							char str[]="Das ist ein einfacher string";
							char *pch;

							cout << "Gesucht wird das 's' in " << str << "\n";

							pch = strchr(str,'s');

							while(pch!=NULL)
							{
								cout << "Gefunden an " << pch-str+1 << "\n";
								pch = strchr(pch+1,'s');
							}

							break;
						}

					case 3:
						{
							cout << "Menuepunkt(03) Suche nach einem Buchstaben in einem Satz\n";

							char String[10000];
							char *pString;
							char Buchstabe;

							cout << "Geben Sie einen String von weniger als 10000 Buchstaben ein!\n";
							gets(String);

							cout << "Nach welchem Buchstaben soll gesucht werden?\n ";
							cin  >> Buchstabe;

							pString = strchr(String, Buchstabe);

							while(pString!=NULL)
							{
								cout << "Gefunden an " << pString-String+1 << "\n";
								pString = strchr(pString+1, Buchstabe);
							}
							break;
						}
					case 4:
						{
							cout << "Menuepunkt(04) Funktion getline\n";
							char name[256], titel[256];

							cout << "Geben Sie Ihren Namen ein:";
							cin.getline(name,256);

							cout << "Geben Sie Ihren Lieblingsfilm ein:";
							cin.getline(titel,256);

							cout << name << "´s Lieblingsfilm ist " << titel << "\n";
							break;
						}
					case 5:
						{
							cout << "Menuepunkt (05) Funktion putback\n"; 
							char c;
							int n;
							char str[256];

							cout << "Geben Sie eine Zahl oder ein Wort ein:";
							c = cin.get();

							if((c>='0')&&(c<='9'))
							{
								cin.putback(c);
								cin  >> n;
								cout << "Sie haben eine Nummer eingegeben " << n << endl;
							}
							else
							{
								cin.putback(c);
								cin  >> str;
								cout << "Sie haben ein Wort eingegeben " << str << endl;
							}

							break;
						}
					case 6:
						{
							cout << "Menuepunkt (06) Funktion put(char)\n";

							char c;

							cout << "Geben Sie einen Buchstaben ein!\n";
							cin  >> c;

							for(c = c; c<='z'; c++)
							{
								putchar(c);
							}
							
							break;
						}
					case 7:
						{
							cout << "Menuepunkt (07) Funktion strstr() bzw. die Suche nach Woertern in einem Text\n";
							char String[100000];
							char *pString;
							char Wort[256];

							cout << "Geben Sie einen Text von weniger als 100000 Buchstaben ein!\n";
							gets(String);

							cout << "Nach welchem Wort soll gesucht werden?\n";
							cin.getline(Wort, 256);

							pString = strstr(String, Wort);

							while(pString!=NULL)
							{
								cout << "Gefunden an " << pString-String+1 << "\n";
								pString = strstr(pString+1, Wort);
							}
							break;
						}
					case 0:
						{
							cout << "Zurueck!\n";
							break;
						}
					}

				}while(number_3!=0);
				break;
			}
		case 3:
			{
				cout << "Exit durch Abbruch!\n";
				break;
			}

		}
	}while(number_1!=0);

	return 0;
}