Forum: Compiler & IDEs Sonderzeichen in konstanten String


von Philipp C. (ba4_philipp)


Lesenswert?

Hallo,

ich würde gerne einen konstanten String an eine Funktion übergeben.

funktion("Das ist der Text mit Sonderzeichen : x");

Wobei x ein Sonderzeichen ist (es steht nicht immer am Ende des Textes). 
Am schönsten wäre es, wenn man einige Zeichen wie \n oder so noch 
definieren könnte. Oder gibt es eine Möglichkeit Sonderzeichen direkt in 
den String zu schreiben? So ala "Texte mit \0x3f Sonderzeichen" ?

sprintf usw würde ich gerne vermeiden. Es sollte möglichst klein sein 
(vom Flash) und es würde mich auch ein wenig stören, wenn der Controller 
einen Text zusammenbauen muss, den eigentlich der Compiler schon hätte 
zusammenbauen können.

Ich hoffe ich konnte einigermassen ausdrücken was ich gerne möchte.

Vielen Dank schonmal
Gruß Philipp

von Karl H. (kbuchegg)


Lesenswert?

"Texte mit \03 Sonderzeichen"

\03  ist dabei das Zeichen mit dem ASCII Code 0x03

von Philipp C. (ba4_philipp)


Lesenswert?

Vielen dank. Das ist genau das was ich suchte.

Gruß Philipp

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Vorsicht:

Die Schreibweise \03 erwartet Oktalzahlen, \08 beispielsweise geht 
nicht.

Besser \x03 in hexadezimaler Notation verwenden ...

von Philipp C (Gast)


Lesenswert?

Habs auch vorhin gemerkt :)

\41 ergab ! und nicht A

Woran wird eigentlich unterschieden ob ich \0 und danach ne Zahl in ein 
char* schreiben möchte oder ob es zB \03 sein soll?

Gruß Philipp

von Karl H. (kbuchegg)


Lesenswert?

Am Leerzeichen das dazwischen steht.

Es gibt aber noch einen Trick.
Der Compiler muss mehrere String-Literale die hintereinander
aufgeführt werden zu einem einzigen zusammenfassen.

D.h. ob du

   "Hallo " "Welt"

oder

  "Hallo Welt"

oder

  "Ha" "ll" "o W" "el" "t"

schreibst ist völlig Wurscht. Ist immer dasselbe: Ein
einziger String mit dem Inhalt "Hallo Welt"

Damit kannst du schreiben

   "Texte mit " "\0x41" "5 Sonderzeichen"

Du kannst natürlich dann auch mit Makros arbeiten

// Wenn du zb. in einem LCD die Sonderzeichen 0x01 und
// 0x02 mit Dreieck nach links bzw. Dreieck nach rechts
// belegt hast
#define LEFT "\0x01"
#define RIGHT "\0x02"

....

  lcd_puts( LEFT " Ueberschrift " RIGHT );

Nach der Makro Expansion steht da:

  lcd_puts( "0x01" " Ueberschrift " "0x02" );

Und der Compiler zieht die einzelnen STrings zu einem
zusammen:

  lcd_puts( "0x01 Ueberschrift 0x02" );

von Falk (Gast)


Lesenswert?

@Karl heinz Buchegger

>   "Texte mit " "\0x41" "5 Sonderzeichen"

Korrektur!

Es muss heissen

   "Texte mit " "\x41" "5 Sonderzeichen"

OHNE 0! Sonst meckert der Compiler, weil er \0 als NULL einfügt und den 
Rest als normale Buchstaben. Und es gibt noch eine weitere Stolperfalle.
Man kann diese Sonderzeichen problemlos direkt in einen String schreiben 
ala

"Das ist schön!" für ein Standard-LCD-> "Das ist sch\xEFn!"

Doch hier lauert McMurphy. In einem String wie "Ich bin am Drücker" 
würde man intuitiv als "Ich bin am Dr\xF5cker" schreiben. Allerdings 
interpretiert der Parser nicht F5 als Char, sondern F5C, weil ja der 
nächste Buchstabe ein C ist. Da das nicht mehr in 8 Bit passt gibts ne 
Warnung und es kommt auch Müll raus. Also immer schreiben
"Ich bin am Dr" "\xF5" "cker"

MfG
Falk

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.