023
21.03.2004, 20:58 Uhr
Pablo
Supertux (Operator)
|
Ja, cSymbol_1[1] nimmt tatsächich nur ein Zeichen auf, weil es das 2. Element des char Arrays. Aber da du cSymbol_1 als C String befasst, dann war das im prinzip falsch.
C Strings sind Arrays von char. Das heißt, es handelt sich um eine Folge von Zeichen. Da unter C keine Möglichkiet gibt, die Länge eines festustellen (es gibt keine Funktion, die dazu in der Lage ist), muss man sich anders überlegem und ein Trick einbauen, so dass die Standard C Funktionen das Ende einer Zeichenkette erkennen können. Die Länge der Zeichenkette muss nicht unbedingt gleich der Länge des Arrays. Am Ende jeder Zeichkette haben C Strings das \0-Terminierendezeichen. Mit Hilfe dieses zeichen wissen die C Funktionen, dass die Zeichenkette am Ende ist.
Wenn du das machst, dann hast du ein Array von char mit 10 Elementen, das heißt, dort kannst du C Strings speichern, deren Länge kleiner oder gleich 9 ist. Denn es gibt immer das \0 und das muss mitgezählt werden. Man kann zwar auf das \0 verzichten, ist aber sehr gefählrich, weil die Standard C Funktionen ohne \0 undefiniert arbeiten, d.h. man kann nicht wissen, was passieren kann. Deshalb gibt es immer das \0 Zeichen.
Nun haben wir Hallo in x gespeichert, Hallo hat die Länge 5, benutzt aber 6 Zeichen. Da 6<9 passt "hallo" in x. Das Heißt, x[0]=='H', x[1]=='a', x[2]='l', x[3]='l';x[4]='o', x[5]='\0', x[6...9]=nicht definiert, es ist egal, was dort steht, da \0 schon an der 6. Stelle sich befindet.
Du hast erstens c_Symbol so definieret:
Das ist unnützlich. Wenn du ein Array mit nur einem Element willst, wozu dann das Array? Dann reicht nur
Vielleicht willst du aber da als Zeichenkette haben, aber eine Zeichenkette der Länge 1. Also brauchst du mindestens 2 Elemente. Richtig wäre dann
C++: |
char cSymbol_1[2]; cSymbol_1[1]='\0';
|
Da in diesem Fall cSymbol ein C String ist, muss mit \0 terminiert werden. Da wir nur 2 Elemente zur Verfügung haben, müssen wir \0 an der 2. Stelle zuweisen, also an cSymbol_1[1].
Ich hoffe, dir ist ein bisschen klarer was ein C String ist. Sonst lies mal hier, Die Sache mit den Rückgabewerten (In der FAQ)
Das ganze gilt auch für C++, da C++ auch mit C Strings arbeiten kann. Aber unter C++ gibt es die Klasse string, die eine einfache Handhabung hat als C Strings. Und wenn du mit C++ arbeitest, solltest du lieber mit string arbeiten und nicht mit char*. -- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth! |