Char VS String
-
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-StringundC++-Stringunterscheiden...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 ArgumenteEdit²:
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::stringverwenden? Ich weiß jetzt leider nicht mehr, wer es hier bei diesem Thread geschrieben hat, aber die Funktiongetssollte 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::stringverwenden? Ich weiß jetzt leider nicht mehr, wer es hier bei diesem Thread geschrieben hat, aber die Funktiongetssollte 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...
