Forum: Mikrocontroller und Digitale Elektronik C-String Position statt Zeichen


von Onkel Tom (Gast)


Lesenswert?

Vermutlich fehlen mir hier C-Grundkenntnisse. Wie kann ich in einem 
C-String wie z.B.
1
char sTxt[20] = "Hallo Welt!";

ein Zeichen einfügen, ohne dass ich das Zeichen selber in den String 
einfüge sondern statt beispielsweise dem "!" dessen ASCII Nummer 
einfüge?
1
char sTxt[20] = "Hallo Welt%NUMMER";

Danke für die Hilfe :)

von SebiR (Gast)


Lesenswert?

sTxt[10] = 33;

von Onkel Tom (Gast)


Lesenswert?

Und was ist, wenn dieser String in einem Funktionsaufruf eingebettet 
ist?
1
Funktion("Hallo Welt!");

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?


von Nop (Gast)


Lesenswert?

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
char sTxt[20] = "Hallo\x21 " "Welt";

Alternativ auch mit drei Oktalziffern (hex 0x21 == oct 033):
1
char sTxt[20] = "Hallo\033 Welt";

von Nop (Gast)


Lesenswert?

Nop schrieb:

> char sTxt[20] = "Hallo\x21 " "Welt";

Gnaa.. gemeint war
1
char sTxt[20] = "Hallo\x21" " Welt";

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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:
1
char sTxt[20] = "Hallo\x21 Welt\x21";

von Onkel Tom (Gast)


Lesenswert?

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?

von user (Gast)


Lesenswert?

nein, sowas genügt "\x2112345"

von W.S. (Gast)


Lesenswert?

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.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

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
char sTxt[20] = "Hallo Welt!";

ist aus mehreren Gründen meist besser als

1
char sTxt[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.

von Nop (Gast)


Lesenswert?

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.

von Nop (Gast)


Lesenswert?

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.

von Nop (Gast)


Lesenswert?

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.

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.