005
02.08.2005, 12:31 Uhr
Pablo
Supertux (Operator)
|
Zitat von ~Silence: |
Hallo
hat von euch jemand Ahnung und kann mir vielleicht sagen warum folgendes C++ Programm nicht läuft? Der Compiller meckert bei if immer. Er meint da wäre ein Vergleich zwischen einem pointer und integer, aber a ist ja vom Typ char.
|
weil du ein Vergleich zwischen einen Pointer und einem Char machst, du vergleichst Biernen und Äpfeln auf Inhalt-Gleichheit.
a ist zwar ein Array von Typ char mit 20 Einträgen, aber wenn du nur "a" schreibst (ich meine ohne a[irgendeinwert]) dann ist "a" die Adresse auf das erste Element des Arrays, also verhält sich in diesem Fall wie ein Zeiger.
In C/C++ sind Strings solche Konstrukte, die mit Anführungszeichen begrenzt sind.
C++: |
"ich bin ein string"
|
Am Ende dieses Strings (im Speicher) ist auch das '\0' Character gespeichert.
Charactere sind aber nur einzelne Zeichen, also nur ein Zeichen, und die werden nur durch Hochkommatas begrenzt und nur ein Zeichen enthält.
C++: |
'a' /* das ist richtig, das ist ein Zeichen */ 'abc' /* falsch, denn abc kein Zeichen ist sondern 3 */
|
Bei diesem Fehler bin ich aber nicht sicher, wie die compilier sich verhalten. Ich hab auch nicht nachgeschaut, was im Standard diesbezüglich steht, aber ich denke, dass der Compiler meckert, dass das falsch ist oder ignoriert einfach die restlichen Zeichen.
Gehen wir davon aus, dass dein Compiler 'HDG' als nur 'H' interpretiert.
bedeutet, "vergleiche den Inhalt der Variable a mit dem Wert 'H' ". So, a zeigt in diesem Fall auf eine Speicherstelle, liefert eine Speicheradresse zurück. 'H' ist ein Character und das ASCII-CODE von 'H' ist 72. Also du vergleichst eine Speicheradresse mit dem Wert 72.
Angenommen, du machst:
dann meckert der Compiler nicht, denn "H" die Speicheradresse liefert, auf der das Strings "H" gespeichert ist ({'H', '\0'}). Also ist das ein Vergleich von Adressen, du vergleichst nur Speicheradressen und nicht den Inhalt der Speicheradressen. Deswegen würde in diesem Fall zwar keinen Fehler geben aber stets die if Anfrage übersprungen.
Um den Inhalt von Strings zu vergleichen gibt es strcmp(3).
Was der Handhabung von Strings in C angeht, solltest du dir das hier anschauen: FAQ::Strings Handhabung
Wenn du schon C++ benutzt, dann würde ich std::strings bevorzugen. -- A! Elbereth Gilthoniel! silivren penna míriel o menel aglar elenath, Gilthoniel, A! Elbereth! |