Niklas G. schrieb:> Angabe hexadezimal:char sTxt[20] => "HalloWelt\x21";https://de.wikipedia.org/wiki/Escape-Sequenz#In_C_...
Wenn das Zeichen nicht am Ende sein soll, geht auch sowas, weil
Stringliterale automatisch zusammengefügt werden, wenn sie direkt
nacheinander stehen:
1
charsTxt[20]="Hallo\x21 ""Welt";
Alternativ auch mit drei Oktalziffern (hex 0x21 == oct 033):
Nop schrieb:> Wenn das Zeichen nicht am Ende sein soll,
Hm? Escape-Sequenzen können an beliebigen Positionen stehen, das
Zusammenfügen von Literalen braucht's dazu nicht:
Nop schrieb:> Wenn das Zeichen nicht am Ende sein soll, geht auch sowas, weil> Stringliterale automatisch zusammengefügt werden, wenn sie direkt> nacheinander stehen:> char sTxt[20] = "Hallo\x21 " "Welt";
Danke, das funktioniert prinzipiel. Was ist aber, wenn ich nach \x21
eine Zahl stehen haben möchte? "!12345" muss dann zu "\x21""12345"
gemacht werden?
Onkel Tom schrieb:> Vermutlich fehlen mir hier C-Grundkenntnisse. Wie kann ich in einem> C-String wie z.B.> char sTxt[20] = "Hallo Welt!";>> ein Zeichen einfügen, ohne dass ich das Zeichen selber in den String> einfüge..
Versuche erstmal, dir darüber klar zu werden, was und wo du tun willst.
Wenn du sowas im PC machen willst, wo alles im RAM steht, dann ist das
was anderes als in einem Mikrocontroller, wo dein konstanter Text je
nach Plattform und Compiler entweder gleich im Flash landet oder als
Vorbelegungsblock im Flash landet, von wo aus er durch den Startupcode
in den RAM gehievt worden ist.
Als nächstes vermeide bitte Ausdrücke wie diesen:
char sTxt[20] = "Hallo Welt!";
Denn das ist eine Kombi aus Deklaration und Zuweisung. Jaja, man kann
es machen, aber in C kann man viel dummes Zeug machen, ohne daß der
Compiler einen wegen schlechten Stils auf die Finger haut. Man straft
sich bloß selber, weil man anschleißend viel Zeit für die eigenen
Denkfehler braucht.
Also entweder:
const char sTxt[20] = "Hallo Welt!";
und es landet im Flash, oder
char sTxt[20];
und es landet im RAM, ist aber noch uninitialisiert.
strcpy(sTxt, "Hallo du da");
(jetzt müßte ich bloß noch gucken, ob ich die Argumente von strcpy
richtig herum geschrieben habe..)
Im RAM kannst du dann anstellen, was du willst:
sTxt[5] = 'D';
sTxt[6] = 85;
W.S.
W.S. schrieb:> Denn das ist eine Kombi aus Deklaration und Zuweisung.
Das wird aber meist als gut angesehen, denn dadurch hat man eine
strengere Prüfung als bei der Zuweisung, und man kann nicht
versehentlich zwischen den beiden Zeilen etwas einfügen, was dann den
uninitialisierten Wert nutzt. Generell sollte man Variablen erst dann
definieren wenn man auch einen Wert für sie hat, und sie sofort damit
initialisieren.
W.S. schrieb:> und es landet im RAM, ist aber noch uninitialisiert.
Genau das möchte man nicht haben. Variablen ohne Wert kann man
versehentlich verwenden, und dann kann einiges schief gehen.
W.S. schrieb:> strcpy(sTxt, "Hallo du da");
Und wenn schon, dann strncpy um Überläufe zu vermeiden. Das kann bei der
direkten Initialisierung auch nicht passieren.
Onkel Tom schrieb:> Was ist aber, wenn ich nach \x21 eine Zahl stehen haben möchte?> "!12345" muss dann zu "\x21""12345" gemacht werden?
Ja.
W.S. schrieb:> Als nächstes vermeide bitte Ausdrücke wie diesen:> char sTxt[20] = "Hallo Welt!";>> Denn das ist eine Kombi aus Deklaration und Zuweisung.
Nein, das ist keine Zuweisung, sondern eine Initialisierung. Eine
Initialisierung ist i.Allg. einer Zuweisung vorzuziehen. Konkret:
1
charsTxt[20]="Hallo Welt!";
ist aus mehreren Gründen meist besser als
1
charsTxt[20];
2
strcpy(sTxt,"Hallo du da");
Das ist jetzt aber ein ganz anderes Thema und hat mit der Frage des TE
nichts zu tun.
Niklas G. schrieb:> Hm? Escape-Sequenzen können an beliebigen Positionen stehen, das> Zusammenfügen von Literalen braucht's dazu nicht:
Und was machst Du, wenn nach der Hex-Zahl nicht ein Leerzeichen kommt,
sondern z.B. eine Ziffer '0' bis '9' oder 'a' bis 'f'? Deswegen die Idee
mit dem Stringende, das geht immer. Alternativ geht auch die
Oktalversion immer, wenn man das konsequent mit drei Ziffern umsetzt.
Dann ist es egal, ob danach ein Nutzzeichen '0' im String kommt.
Was nämlich bei "0x21abc" passiert, ist implementierungsabhängig, und
darauf sollte man sich nicht einlassen.
Onkel Tom schrieb:> Danke, das funktioniert prinzipiel. Was ist aber, wenn ich nach \x21> eine Zahl stehen haben möchte? "!12345" muss dann zu "\x21""12345"> gemacht werden?
Genau.
W.S. schrieb:> Als nächstes vermeide bitte Ausdrücke wie diesen:> char sTxt[20] = "Hallo Welt!";>> Denn das ist eine Kombi aus Deklaration und Zuweisung.
Das nennt sich Initialisierung und ist vollkommen normal. Aber Deine
Beiträge zum Thema Initialisierung in C sind ja bekanntermaßen oftmals
fragwürdig und von Halbwissen geprägt.