Der Martin: C: Wer erklärt mir diese Zeile?

Beitrag lesen

Hallo,

  1. c != '\n' sollte ich nicht erklären müssen oder?
    Stellt das in C das Zeilenende dar?

richtig, ganz genau das Steuerzeichen Linefeed.

PHP jedenfalls unterscheidet zwischen "\n" (wird interpretiert) und '\n' (meint die beiden Zeichen).

Korrekt.
Und auch in C ist es ein Unterschied, ob man '\n' oder "\n" notiert:

Einfache Anführungszeichen benutzt man, wenn man konkret ein einzelnes Zeichen angeben möchte. Das ist dann vom Typ char, der seinerseits zu int kompatibel ist. Daher sind folgende Anweisungen vollkommen gleichwertig (vorausgesetzt, c ist als char- oder int-Typ deklariert):

c = '\n';  
c = 10;  
c = '\t'+1;

Das letzte Beispiel ist in der Praxis vermutlich sinnfrei, hier nur als Kuriosum: \t stellt ein Tab-Zeichen dar, also numerisch 9. Eins dazugezählt ergibt 10. ;-)

Verwendet man dagegen doppelte Anführungszeichen, meint man einen String, der beliebig lang sein kann und implizit noch mit einem Nullbyte abgeschlossen wird. Der Ausdruck ist dann vom Typ char* (Zeiger auf char).
Die Anweisung

c = "\n";

setzt also voraus, dass c als char* deklariert ist (sonst gibt's schon beim Übersetzen einen Fehler), und lässt c dann auf einen Speicherbereich zeigen, in dem hintereinander die Byte-Werte 10 und 0 stehen.

Wie würde man in C mit den beiden Zeichen '\n' vergleichen?

Indem man, wie bubble schon gezeigt hat, dem Backslash seine Sonderbedeutung nimmt und ihn selbst wieder "escapet". Allerdings ist ein Stringvergleich in reinem C (nicht C++) schon tricky, denn die Abfrage

if (string1==string2) ...

liefert nicht das Ergebnis, das manche erwarten. Sie vergleicht nicht die beiden Strings, sondern die beiden Zeiger - also die Speicheradressen, an denen die beiden Strings abgelegt sind, nicht deren Inhalt. Darum liefert diese Abfrage auch nur dann true, wenn beide Zeiger identisch sind. Um Strings richtig zu vergleichen, muss man in C auf die Standardfunktion strcmp() oder eine ihrer Varianten zurückgreifen.

So long,
 Martin

--
Wer barfuß geht, dem kann man nicht die Schuld in die Schuhe schieben.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(