Forum: Compiler & IDEs ASCII Code einzelnes Zeichen != Zeichenkette?


von Michael L. (fliegermichl)


Lesenswert?

Hallo zusammen,

ich habe eine Menüführung mit LCD Ausgabe programmiert.
Da das Menü auch länger sein kann, als auf eine Zeile im LCD Display 
passt, soll ein Zeichen (Code 126 (Pfeil rechts Symbol)) am Ende 
signalisieren, daß rechts noch mehr kommt.

Bewegt der Anwender sich auf einen solchen weiter rechts liegenden 
Menüpunkt,
soll an der linkesten Display Stelle das Zeichen mit dem Ascii Code 127 
(Pfeil links) signalisieren, daß weiter links noch was kommt.

ich bastle zunächst die gesamte Menüzeile zusammen, extrahiere daraus 
den zur Zeit gültigen Teil und füge per strcat die Pfeile und den 
aktuellen Menütext zusammen.

lcdout ist als char lcdout[17] deklariert und mit \0 gefüllt. In char 
*menu steht der aktuelle Menüinhalt und ist auch max. 14 Zeichen lang.

mache ich das so:
1
 strcat(lcdout, "⌂"); // Alt+127 auf der Zehnertastatur 
2
 strcat(lcdout, menu);
3
 strcat(lcdout, "~"); // Alt+126 auf der Zehnertastatur

Dann stimmt das Zeichen am Ende, das am Anfang ist aber ein vollkommen 
falsches Zeichen.

Mache ich es hingegen so:
1
 *lcdout = 127;
2
 strcat(lcdout, menu);
3
 strcat(lcdout, "~");

dann passt die Ausgabe. Kann mir jemand dieses Verhalten erklären?

Viele Grüße
 Michl

von Hmm (Gast)


Lesenswert?

"⌂" ist kein ASCII-Zeichen. Das mit dem Code Dezimal 127 ist ein DEL. 
Dein Compiler wird aber nur druckbare ASCII-Zeichen behandeln.
Wenn Du aber anstelle dessen das Nullte Zeichen im String mittels
1
*lcdout = 127;
initialisierst, dann weiss der Compiler was er zu tun hat.
Er akzeptiert nämlich durchaus Integer Literale auch als char Literale.

>...ein vollkommen falsches Zeichen.
An dieser Stelle würde es hilfreich sein, welches Zeichen nun 
tatsächlich ausgegeben wird. Aber na gut.

Wenn Du aber durchaus einen String verwenden willst, dann nimm die 
"\x7F"-Variante.

Ein bisschen stutzig und neugierig auf die tatsächliche ASCII-Tabelle 
wäre ich an Deiner Stelle geworden, wenn mir bei der Eingabe ein ganz 
anderes Zeichen angezeigt wird als bei der Ausgabe. Nimm solche 
Widersprüche nie hin.

von Hmm (Gast)


Lesenswert?

>Dein Compiler wird aber nur druckbare ASCII-Zeichen behandeln.
Diese Aussage ist ein wenig oberflächlich und mag Dir auch 
widersprüchlich vorkommen.

Der Punkt ist, das String-Literale auf eine ganz gewisse Weise geformt 
werden müssen. Insbesondere für den Fall, das ein nicht druckbares 
ASCII-Zeichen verwendet wird, das ein anderes Gerät (Dein LCD) als 
druckbar akzeptiert. Das Beispiel habe ich Dir oben gegeben.

Für Nähere Informationen sieh' bitte in Dein C-Buch.

von Hmm (Gast)


Lesenswert?

>lcdout ist als char lcdout[17] deklariert und mit \0 gefüllt.

von Hmm (Gast)


Lesenswert?

OK. Rufus. Kannst meinen Beitrag auch löschen. :-) Und diesen auch.

von DirkB (Gast)


Lesenswert?

Dann mach doch auch ganz sicher das Zeichen 127 und nicht das, was dein 
PC bei ALT-127 noch rein interpretiert.
1
strcat(lcdout, "\x7F"); // 0x7f = 127

von Hmm (Gast)


Lesenswert?

Ich würde sogar sagen, er sollte ""\x7F" nehmen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.