Anfaengerfrage
-
std::string
-
Also bei einer string definition eines arrays gehen jeweils 2 plaetze fuer die "" floeten und bei einzelner definition geht ein platz weg wegen der nullterminierung?
-
kamelkacke schrieb:
.., aber wie du geschrieben hast, stehen in dem array 4 plaetze zur verfuegung. ...
Nein, da sind nur 3 Plätze.
char bitch[3];bedeutet: Ein char-Array mit drei Elementen, dessen Index von 0 bis 2 geht. Da gibt es keinbitch[3]zum Zeichen ablegen.Die "" von einem Stringliteral werden nicht im Array abgelegt. Das einzige was dazu kommt ist der '\0'-Terminator.
Und du darfst C-Strings nicht mit einem Zeichen verwechseln.
"9" ist etwas anderes als '9' ist etwas anderes als 9
-
"xyz" ist vom Typ const char [4]. Der Inhalt ist {'x', 'y', 'z', '\0'}. Wenn du schreibst const char bla[3] = "xyz";, dann ist bla vom Typ const char [3] mit dem Inhalt {'x', 'y', 'z'}.
cout ist ein Objekt was ungefähr so funktioniert:
ostream &operator << (const char *s){ while (*s != '\0'){ gebeAus(*s); s++; } return *this; }Er gibt so lange die Zeichen aus bis er ein '\0'-Zeichen trifft. Da dein Array nicht mit einem '\0'-Zeichen endet gibt cout munter weiter irgendwelchen Speicher aus bis er zufällig eine '\0' findet oder das Betriebssystem dein Programm wegen einer Zugriffsverletzung abschießt.
Lösung: Das '\0'-Zeichen dran tun oder std::string benutzen oder cout sonst irgendwie sagen, dass er nur die ersten 3 Zeichen ausgeben soll oder sich freuen, dass komische Sachen ausgegeben werden.
-
nwp3 schrieb:
Wenn du schreibst const char bla[3] = "xyz";, dann ist bla vom Typ const char [3] mit dem Inhalt {'x', 'y', 'z'}.
Das sollte ill-formed sein. Ein Zeichenkettenliteral endet immer mit einem 0-Terminator, und damit liegen zuviele Initialisierer vor.
-
Boah...also der compiler macht alles richtig, indem er in bitch keine 3 buchstaben aufnehmen will??
-
vier
-
Er nimmt aber nicht mal drei, darum gehts doch.
-
Doch, da passen drei Zeichen rein. Wenn das letzte Zeichen kein '\0' ist, kannst du es aber nicht mit
coutüberprüfen, da das bei einem char* einen C-String erwartet.
-
Er nimmt noch nichtmal einen, er nimmt garkeinen, weil er die vier nicht nimmt, weil vier nicht in drei passen.
-
Ne guck doch mal auf die compilerwarnung in seite 1. Da steht doch dass 3 fuer ihn zu lang ist
-
Nee, steht da nicht!
-
Don't feed the troll.
-
Ok jetzt hab ichs..danke