Name mit char?
-
Hi,
ich benutze Visual Studio 2010 und diesen Quellcode:#include <iostream>
using namespace std;
int main()
{
//Variablen
//
char chName;cout << "Wie ist dein Name?\n";
cin >> chName;
cout << "Hallo " << chName << "!\n";
system ("pause");
}Ich will, dass dein Name da steht aber es steht nur der erste Buchstabe da.
Was muss ich ändern?P.S.: Ihr denkt vielleicht, dass das eine dumme Frage ist aber ich bin leider noch Anfänger

-
char ist auch nur ein Zeichen, nimm std::string, für den Anfang reicht der, auch wenn er nicht toll ist.
-
ja schrieb:
auch wenn er nicht toll ist.

-
#include <iostream> #include <string> #include <cstdlib> using namespace std; int main() { //Variablen // string Name; cout << "Wie ist dein Name?"<<endl; getline(cin,Name);// nicht cin>> denn dann wird nur bis zum ersten White-Space gelesen cout << "Hallo " << chName << '!' <<endl; system("pause"); }P.S.: 'string Name;' ist sehr viel nützlicher als
char* Name;// (Die C-String Deklaration), denn der ist sehr viel schlechter, und die einzige andere Möglichkeit um einen String zu erzeugen (außer
char Zeigername[anzahl_Zeichen];, was so ungefähr dasselbe ist). Deswegen würd ich mir das nochmal ganz genau angucken.
-
ja schrieb:
char ist auch nur ein Zeichen, nimm std::string, für den Anfang reicht der, auch wenn er nicht toll ist.
Was hättest du den sonst anzubieten, was in der Anwendungsbreite von std::string besser ist?
-
Danke an alle!
Das hat mir sehr geholfen!
-
Hacker schrieb:
P.S.: 'string Name;' ist sehr viel nützlicher als
char* Name;// (Die C-String Deklaration), denn der ist sehr viel schlechter, und die einzige andere Möglichkeit um einen String zu erzeugen (außer
char Zeigername[anzahl_Zeichen];, was so ungefähr dasselbe ist). Deswegen würd ich mir das nochmal ganz genau angucken.
Grund? Du sagst nur "A ist besser als B weil B schlechter als A ist"

Auf system("pause"); geh ich mal nicht ein.
-
Grund? Du sagst nur "A ist besser als B weil B schlechter als A ist"

Auf system("pause"); geh ich mal nicht ein.Ich bin sicher system(); war nur als Beispiel , was du sicher genau weißt

Und ich fin string auch besser weil char schlechter ist x'DD.....

-
314159265358979 schrieb:
Hacker schrieb:
P.S.: 'string Name;' ist sehr viel nützlicher als
char* Name;// (Die C-String Deklaration), denn der ist sehr viel schlechter, und die einzige andere Möglichkeit um einen String zu erzeugen (außer
char Zeigername[anzahl_Zeichen];, was so ungefähr dasselbe ist). Deswegen würd ich mir das nochmal ganz genau angucken.
Grund? Du sagst nur "A ist besser als B weil B schlechter als A ist"

Auf system("pause"); geh ich mal nicht ein.1. system("pause") hab ich nur gelassen, weil er es auch drin hatte.
2. Willst du Gründe?
-char* hat massig Probleme mit Pufferüberläufen, es wird dank nicht aufgepassten Kopierfunktionen wie strcpy oder strcat in unerlaubte Speicherbereiche geschrieben was schlimme Folgen haben kann
-Es ist sehr umständlich, die ganzen Funktionen zum Bearbeiten zu verwenden, die ja in string bereits vereinfacht und effektiv untergebracht sind;
Beispielcode:
#include <iostream> #include <string> #include <cstring> using namespace std; int main(){ char a[10]="lalala";/*bzw. strcpy(),strncpy();*/ string b("lalala");//Funktioniert auch mit anderen strings, auch für Bereichs-übernahme (z.B.: string c(b,3,3);) // Was es (soweit ich weiß) in C gar nicht gibt. /*Länge des C-Strings a nicht regulier-bar. Die des C++-Strings b hingegen wunderbar und implizit, z.b. mit resize,reserve*/ b.length();// bzw. size() strlen(a); // C-String funktion strcat(a,"wef"); // bzw. strncat(); b += "wef"; //Sehr viel einfacher, Dank überladenen Operatoren kein Problem strcpy(a,"la");// Zu verwenden auch bei einem anderen C-String b = "la"; // Dank überladenen Operatoren kein Problem, es geht auch .assign("la"); /*Auch noch andere lasten werden abgenommen, darunter auch die Suchfunktionen - mit C-Strings strstr,strchr,strrchr, strcspn,(memchr) ... In C++-Strings dank überladener Member-Funktionen mit find und rfind */ strchr(a,'l');//bzw. strrchr(); b.rfind('l'); // Kann für vieles genutzt werden (zusammen mit .find();) //Strings kann man auch z.b. als c-Strings einer C-Funktion übergeben, mit b.c_str(); b.data(); b.copy(a,3,1);//Kopiert in C-strings //Dann gibts noch insert(), welches strings ineinander setzt: b.insert(0,a); //swap vertauscht die Inhalte zweier c++-Strings: string c("lala"); b.swap(c); //append: b.append("lalla");//Wie strcat in C //erase zum löschen von bereichen, clear zum leeren, replace(ähnlich wie assign), sind alles weitere, sehr nützliche //Funktionen, die alles erleichtern. b.erase(2,4); b.clear(); b.replace(0,4,a);//Ersetzt ab pos. 0 4 Zeichen mit dem C-String a }
-
[Rewind] schrieb:
ja schrieb:
char ist auch nur ein Zeichen, nimm std::string, für den Anfang reicht der, auch wenn er nicht toll ist.
Was hättest du den sonst anzubieten, was in der Anwendungsbreite von std::string besser ist?
Wenn du etwas mehr als nur Konsole willst und auch noch im asiatischen Raum SW verkaufen willst würde ich einen Unicode fähigen String nehmen, der zum GUI Framework passt, z.b. QString.
-
Dann nimm std::wstring. Gibt auch noch ein typedef für einen 32-bittigen String, dessen Name mir gerade nicht einfällt. Die C++-Leute haben an sowas schon gedacht, keine Sorge.
-
314159265358979 schrieb:
Dann nimm std::wstring. Gibt auch noch ein typedef für einen 32-bittigen String, dessen Name mir gerade nicht einfällt. Die C++-Leute haben an sowas schon gedacht, keine Sorge.
wstringlöst, außer dem Problem zu wenig Speicherplatz aufgrund der gewählten Zeichenrepräsentation zu haben, gar nichts.
-
Von welchen Problemen ist die Rede?
-
314159265358979 schrieb:
Von welchen Problemen ist die Rede?
Ic denke mal, "ja" meint nicht nur, dass ein
std::stringzu klein ist, Unicode zu speichern (was ja auch nicht per se der Fall ist), sondern die fehlende Unterstützung für Internationalisierung in C++ allgemein. Er will eine Stringklasse die direkt Unicode unterstützt und nicht nur genug Speicher dafür anbietet. QString kann das zum Beispiel. Ob das nun gut ist, sei mal dahingestellt. Mir persönlich kannstd::stringschon viel zu viel...
-
Ja, std::strin hat viel zu viele Memberfunktionen, die nicht sein müssten. Keine Ahnung, wie sowas in den Standard kommen konnte.
Aber Internationalisierung ist doch schon durch locales vorhanden?
-
314159265358979 schrieb:
Ja, std::strin hat viel zu viele Memberfunktionen, die nicht sein müssten. Keine Ahnung, wie sowas in den Standard kommen konnte.?
Was laberst du da?
Nenn' mir mal eine beliebige, deiner Meinung nach unnötige Memberfunktion von
std::string !
-
314159265358979 schrieb:
Aber Internationalisierung ist doch schon durch locales vorhanden?
Die Möglichkeit dafür schon, ja. In der Praxis benutzt das aber irgendwie kaum einer (ich habe es zumindest bis jetzt nie gesehen). Vielleicht habe ich Scheuklappen auf, aber die Meisten die ich kenne, und die mit Internationalisierung zu tun haben, benutzen dafür irgendwelche Frameworks. Mit C++ Bordmitteln arbeitet irgendwie keiner, weils wohl zu kompliziert ist.
-
Hacker schrieb:
314159265358979 schrieb:
Ja, std::strin hat viel zu viele Memberfunktionen, die nicht sein müssten. Keine Ahnung, wie sowas in den Standard kommen konnte.?
Was laberst du da?
Nenn' mir mal eine beliebige, deiner Meinung nach unnötige Memberfunktion von
std::string !Nahezu alle, die über das, was
std::vectoranbietet hinausgehen...
-
Hacker schrieb:
314159265358979 schrieb:
Ja, std::strin hat viel zu viele Memberfunktionen, die nicht sein müssten. Keine Ahnung, wie sowas in den Standard kommen konnte.?
Was laberst du da?
Nenn' mir mal eine beliebige, deiner Meinung nach unnötige Memberfunktion von
std::string !Ich habe mir mal erlaubt, dir Funktionen direkt aus dem Standard zu kopieren:
size_type find (const basic_string& str, size_type pos = 0) size_type find (const charT* s, size_type pos, size_type n) size_type find (const charT* s, size_type pos = 0) const; size_type find (charT c, size_type pos = 0) const noexcept; size_type rfind(const basic_string& str, size_type pos = npos) const noexcept; size_type rfind(const charT* s, size_type pos, size_type n) const;
size_type rfind(const charT* s, size_type pos = npos) const; size_type rfind(charT c, size_type pos = npos) const noexcept;
size_type find_first_of(const basic_string& str, size_type pos = 0) const noexcept;
size_type find_first_of(const charT* s, size_type pos, size_type n) const;
size_type find_first_of(const charT* s, size_type pos = 0) const; size_type find_first_of(charT c, size_type pos = 0) const noexcept; size_type find_last_of (const basic_string& str,
size_type pos = npos) const noexcept; size_type find_last_of (const charT* s,
size_type pos, size_type n) const; size_type find_last_of (const charT* s, size_type pos = npos) const;
size_type find_last_of (charT c, size_type pos = npos) const noexcept;
size_type find_first_not_of(const basic_string& str, size_type pos = 0) const noexcept;
size_type find_first_not_of(const charT* s, size_type pos, size_type n) const;
size_type find_first_not_of(const charT* s, size_type pos = 0) const; size_type find_first_not_of(charT c, size_type pos = 0) const noexcept; size_type find_last_not_of (const basic_string& str,
size_type pos = npos) const noexcept; size_type find_last_not_of (const charT* s, size_type pos,
size_type n) const; size_type find_last_not_of (const charT* s,
size_type pos = npos) const;Das ist noch lang nicht alles.
Und so ganz nebenbei: Hör auf mit deinen absolut trotteligen Posts. Die sind ja noch schlimmer als meine.
-
Jede dieser Funktionen könnte man irgendwann mal brauchen,
keine davon ist direkt unnötig. Die Leute die diese Standards machen wissen was wieso wohin, O.K. ?P.S.: Du hast mir grad 20 verschiedene anstatt nur einer einzigen Funktin vor die Nase gepackt - sind die jetzt alle unnötig ...?
-
Nein, diese Memberfunktionen sind absolut unnötig. Würdest du etwas von gutem Design verstehen, dann wüsstest du, dass Non-Member stets vorzuziehen sind.
Und nun halt endlich deine verdammte Fresse, du gehst mir auf die Eier!