Char VS String



  • Captain Obvious schrieb:

    Das kommt dir vielleicht wie Klugscheißerei vor, aber sich präzise auszudrücken ist beim Programmieren wichtig. Wenn du also ein char-array meinst, dann nenn es auch so.

    Ich meinte den char String...

    Edit:

    Ich muss ein paar Veränderungen vornehmen. Bei manchen Menüpunkten funktioniert die Texteingabe nicht... muss ich wohl mit cin::ignore() ändern??

    Gruß



  • char-array oder C-String. Nicht char, nicht char String. Keine Wörter erfinden.



  • Captain Obvious schrieb:

    char-array oder C-String. Nicht char, nicht char String. Keine Wörter erfinden.

    Entschuldigung...

    Ich wollte Funktionen zwischen C-String und C++-String unterscheiden...

    So jetzt funktioniert es:

    #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:
    						{
    							cin.ignore(2);
    							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:
    						{
    							cin.ignore(3);
    							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:
    						{
    							cin.ignore(4);
    							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:
    						{
    							cin.ignore(5);
    							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:
    						{
    							cin.ignore(6);
    							cout << "Menuepunkt(07) Refernz auf String\n";
    
    							string Eingabe;
    							string &Text_1 =Text(Eingabe);
    							cout << Text_1 << "\n";
    
    							break;
    						}
    					case 8:
    						{
    							cin.ignore(7);
    							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:
    						{
    							cin.ignore(8);
    							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:
    						{
    							cin.ignore(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:
    						{
    							cin.ignore(3);
    							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:
    						{
    							cin.ignore(4);
    							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:
    						{
    							cin.ignore(5);
    							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:
    						{
    							cin.ignore(6);
    							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;
    }
    


  • Irgendwann ist dir das bestimmt schon mal geschrieben worden:

    gets(String);
    

    Das solltest du nicht mehr in aktuellem Code nutzen.
    Zum Einen ist es unsicher.
    Zum 2. ist es in den Standardkomitees auf der Streichliste. D.h. es kann sein das es im nächsten Standard gar nicht mehr zulässig ist.

    Auch Microsoft schreibt in der MSDN gets() nicht mehr nutzen.

    Aber dies ist wahrscheinlich vergebens geschrieben. Du ignorierst das ja eh, oder diesmal nicht?



  • Mach doch erstma, dass Ideone deine Programm auch kompiliert.



  • silent_max schrieb:

    string Text(string Eingabe)
    {
    	cout << "Geben Sie einen Text ein\n";
    	getline(cin, Eingabe);
    
    	return Eingabe;
    }
    

    Warum ist "Eingabe" ein Funktions-Parameter?



  • silent_max schrieb:

    case 7:
        {
            cin.ignore(6);
    	cout << "Menuepunkt(07) Refernz auf String\n";
    							
    	string Eingabe;                 // nicht initialisiert
    	string &Text_1 =Text(Eingabe);  // und hier sinnlos übergeben
    	cout << Text_1 << "\n";
    					
    	break;
        }
    

    und da meckert dein Compiler nicht?



  • Hallo silent_max,
    was sollen die ganzen cin.ignore()?



  • klaus2013 schrieb:

    Hallo silent_max,
    was sollen die ganzen cin.ignore()?

    Ohne diese cin.ignore() überspringt mein Compiler mancherlei Texteingaben...



  • f.-th. schrieb:

    Aber dies ist wahrscheinlich vergebens geschrieben. Du ignorierst das ja eh, oder diesmal nicht?

    Es ist schon ein paar Mal geschrieben worden. Andererseits weiß ich jedoch nicht, wie ich einen C-String, also char , per Tastatur einlesen soll.

    Mit cin.getline ??

    Edit:

    Wenn ich in Zeile 270 statt

    gets(String)
    

    den Code

    cin.getline(String)
    

    schreibe, dann bekomme ich folgende Fehlermeldung:

    error C2661: 'std::basic_istream<_Elem,_Traits>::getline': Keine überladene Funktion akzeptiert 1 Argumente
    

    Edit²:

    Wenn ich jetzt folgenden Code schreibe, also im "Char-Verzeichnis" unter Menüpunkt 3:

    case 3:
    						{
    							cin.ignore(2);
    							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";
    							cin.getline(String, 10000);
    
    							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:
    						{
    							cin.ignore(3);
    							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;
    						}
    

    Dann bekomme ich keine Fehlermeldung.

    Warum muss man denn

    cin.getline(String, 10000);
    

    schreiben?

    Gruß Max



  • Das zweite ist die Größe. Damit du nicht über die Grenzen des Puffers hinweg schreibst.

    char line[20];
    std::cin.getline(line, 20); 
    gets(line);
    

    Was denkst du passiert bei dem Code jeweils wenn mehr als 20 Zeicheewn eingegeben werden?

    Deswegen macht man es im Optimalfall mit std::string.

    std::string line;
    std::getline(std::cin, line);
    

    Da kann man beliebig viele Zeichen eingeben.



  • Ersteinmal vielen Dank für die bisherigen Antworten.

    Ethon schrieb:

    Das zweite ist die Größe. Damit du nicht über die Grenzen des Puffers hinweg schreibst.

    Haben wir etwas dazu gelernt.

    Ethon schrieb:

    char line[20];
    std::cin.getline(line, 20); 
    gets(line);
    

    Was denkst du passiert bei dem Code jeweils wenn mehr als 20 Zeicheewn eingegeben werden?

    Also ich würde im Moment sagen, dass das Programm einen Overflow bekommt und nicht mehr funktioniert. Wobei man von den 20 deklarierten Zeichen 19 Zeichen eingeben kann, da das letzte Zeichen die binäre 0 ist (also '\0'). Habe ich das richtig verstanden??

    Ethon schrieb:

    Deswegen macht man es im Optimalfall mit std::string.

    std::string line;
    std::getline(std::cin, line);
    

    Da kann man beliebig viele Zeichen eingeben.

    So wie ich Dich Ethon und die anderen Beteiligten verstehe, dann sollte man IMMER std::string verwenden? Ich weiß jetzt leider nicht mehr, wer es hier bei diesem Thread geschrieben hat, aber die Funktion gets sollte man laut Microsoft bzw. MSDN nicht mehr verwenden??

    Dazu ein kleines Beispielprogramm:

    #include<iostream>
    #include<string>
    using namespace std;
    
    int main()
    {
    	string Text;
    
    	cout << "Geben Sie einen weiteren Satz ein!\n";
    	getline(cin, Text);
    
    	cout << "Das haben Sie eingegeben: \n";
    	cout << Text << "\n";
    
    	return 0;
    }
    

    Wäre das Beispielprogramm korrekt??

    Gruß

    Max



  • silent_max schrieb:

    Also ich würde im Moment sagen, dass das Programm einen Overflow bekommt und nicht mehr funktioniert. Wobei man von den 20 deklarierten Zeichen 19 Zeichen eingeben kann, da das letzte Zeichen die binäre 0 ist (also '\0'). Habe ich das richtig verstanden??

    Genau, das mit gets ist verbuggt, das mit getline nicht.

    [quote="silent_max"]

    Ethon schrieb:

    Deswegen macht man es im Optimalfall mit std::string.

    std::string line;
    std::getline(std::cin, line);
    

    Da kann man beliebig viele Zeichen eingeben.

    Exakt.

    silent_max schrieb:

    So wie ich Dich Ethon und die anderen Beteiligten verstehe, dann sollte man IMMER std::string verwenden? Ich weiß jetzt leider nicht mehr, wer es hier bei diesem Thread geschrieben hat, aber die Funktion gets sollte man laut Microsoft bzw. MSDN nicht mehr verwenden??

    Es gibt Performancesonderfälle in denen man mit char Arrays anstatt std::string hantieren möchte, die sind aber für dich komplett irrelevant. 🙂

    silent_max schrieb:

    Dazu ein kleines Beispielprogramm:

    #include<iostream>
    #include<string>
    using namespace std;
    
    int main()
    {
    	string Text;
    
    	cout << "Geben Sie einen weiteren Satz ein!\n";
    	getline(cin, Text);
    
    	cout << "Das haben Sie eingegeben: \n";
    	cout << Text << "\n";
    
    	return 0;
    }
    

    Wäre das Beispielprogramm korrekt??

    Ja, das ist korrekt so.



  • Langsam macht es Spaß zu programmieren... 🙂


Anmelden zum Antworten