Forum: Mikrocontroller und Digitale Elektronik Definition STRING


von TOM (Gast)


Lesenswert?

@all,

ich drücke gerade die Schulebank und hätte nun zur Definition eines
Strings eine Frage.
Ich sende von meinem µC mit folgendem Befehl ASCII Zeichen über die
RS232.
printf("start\n");
Mein Lehrer meinte dies ist kein String doch was ist es dann?!?
Er meinte ein String endet mit Nul also 00h.
Hat jemand sich schon damit beschäftigt und kann mir helfen.

Danke TOM

von Ronny (Gast)


Lesenswert?

Ein String ist in der Regel eine Reihe von ASCII-Zeichen,die meistens
aus menschen-lesbaren Zeichen bestehen.Unter C wird ein String meistens
mit einem NULL-Zeichen beendet (das aber nicht so einfach darstellbar
ist und von C auch nur intern zur String-Ende-Kennung benutzt wird).

Unter ganz alten Pascal Varianten gibt es z.B keine NULL als
String-Ende,da steht im 1.Byte die Länge des Strings (1 Byte = 8
Bit,der Pascal-String konnte also nur 255 Zeichen lang sein).

Und nebenbei: Zeichenketten in Anführungszeichen (") werden von C als
String angesehen und mit einer abschliesseneden NULL versehen.Ob printf
diese dann an den UART schickt ist wieder eine andere Frage.

von Karl H. (kbuchegg)


Lesenswert?

> Mein Lehrer meinte dies ist kein String

Dein Lehrer soll sich mal ein C-Lehrbuch kaufen.

> Er meinte ein String endet mit Nul also 00h.

Was glaubt er denn, womit "start\n" endet?

Sachen gibts. Dass die meisten EDV-Lehrer von
programmieren nicht viel Ahnung haben, weiss ich
ja. Dass es aber an den simpelsten Dingen fehlt. Ts, ts.

von Karl H. (kbuchegg)


Lesenswert?

> Ob printf
> diese dann an den UART schickt ist wieder eine andere Frage.

Das tut er mit Sicherheit nicht.

von Dietmar (Gast)


Lesenswert?

@TOM:

printf("start\n"); sendet nacheinander 5 ASCII-Zeichen und dann ein
line feed.

Aus der Hilfe meiner C Entwicklungsumgebung habe ich folgende Info:

The prinf function works like the ANSI C library function. The first
argument is a format string. Following arguments may be expressions or
strings. The conventional ANSI C formatting specifications apply to
printf.

Example
printf ("random number = %04XH\n", rand(0))
random number = 1014H

Also: Der Ausdruck innerhalb der "" ist auch ein String. Folgende
Argumente können Variablen oder Strings (das sind die von dir gemeinten
mit Null-Terminierung) sein.

Gruß

Dietmar

von Detlev Tietjen (Gast)


Lesenswert?

@TOM
Dein Lehrer hat recht. Besser wäre es aber, wenn er das dann auch noch
gut erklärt hätte...

Wenn mein Gedächtnis noch funktioniert:
In C ist ein string ein array vom typ char, das nullterminiert ist, das
heißt ein Wert null zeigt das Ende des strings an. Der Inhalt eines
Strings kann zur Laufzeit des Programmes verändert werden, z.B mit den
Funktionen aus string.h .

"Irgendetwas" ist hingegen ein Literal, also etwas was insbesondere
zur Laufzeit nicht mehr geändert werden kann. Technisch wird dies in
der Regel vom Compiler auch anders behandelt als ein String.

ABER:
Nach C-Konvention sind solche (String-) Literale mit Strings
kompatibel, das heißt statt eines strings kann auch ein solches Literal
stehen, wenn es nicht verändert werden würde, Beispiel:

strcat(mystring, "Anhang"); ist erlaubt, hängt "Anhang" an mystring
an
strcat("Anhang", mystring); ist NICHT erlaubt, da "Anhang" nicht
geändert werden kann/darf.

Gruß, Detlev

von Ronny (Gast)


Lesenswert?

@Karl Heinz:

Natürlich tut er es nicht,es wäre nicht so prima wenn die Funktion
einfach mal ein Byte (noch dazu ein Steuerbyte) extra ausgibt.Ist wohl
doch schon spät am Abend ;)

Aber der String der übergeben wird,ist definitiv NULL-Terminiert.

Und zur Qualifikation unserer Informatik-Lehrer (vor allem an
Gymnasien/Mittelschulen) sag ich mal lieber nix weiter.

von Karl H. (kbuchegg)


Lesenswert?

Sorry, Detlef
Aber da musst du noch mal nachlesen.
Wo und wie ein String gespeichert wird, hat absolut
nichts damit zu tun was einen String ausmacht.
Ein String ist in C ganz einfach eine Character
Sequenz, die mit einem '\0' Zeichen abgeschlossen
wird.

Ein char-Array ist einfach nur eine Möglichkeit
Speicherfläche bereitzustellen, die einen String
aufnehmen kann. Aber weder ist ein char-Array
ein String, noch wird ein char-Array mit einem '\0'
Zeichen abgeschlossen. Der Inhalt eines Strings
kann auch nicht verändert werden, da ein String
genausowenig einen Inhalt hat, wie 5 einen Inhalt
hat. Der Inhalt eines Arrays kann verändert werden,
genauso wie der Inhalt einer int-Variable verändert
werden kann. Du schmeisst hier Datentypen mit
Variablen die diesen Datentyp aufnehmen können
durcheinander.

String-Literale sind auch nicht bloss mit Strings
kompatibel, String-Literale sind Strings!

von Karl H. (kbuchegg)


Lesenswert?

> Natürlich tut er es nicht,es wäre nicht so prima wenn die
> Funktion einfach mal ein Byte (noch dazu ein Steuerbyte)
> extra ausgibt.Ist wohl doch schon spät am Abend ;)

Vorsicht: Ein \n wird auf DOS/Windows Systemen zu 0x0D 0x0A
expandiert. Soviel zum Thema 'ein Steuerbyte extra ausgeben' :-)

> Aber der String der übergeben wird,ist definitiv NULL-Terminiert.

Ja klar. Alles was zwischen " steht, ist per Definition ein String.
Und Strings sind per Definition '\0' terminiert. Wäre
er das nicht, wärs kein String :-)

von Ronny (Gast)


Lesenswert?

Eine Funktion die ein String-Literal annimmt,erwartet etwas vom Typ

*char

Und wenn dies eine String-Funktion ist,erwartet sie eben,das das array
of char auch mit #0 abgeschlossen ist.Muss sie aber nicht,weil es den
Datentyp String in C schlicht und ergreifend nicht gibt.Wo ein String
erwartet wird,wird schlicht ein Zeiger übergeben.Damit die Daten am
Zeiger sinnvoll interpretiert werden können,sind sie eben ASCII-Zeichen
mit Ende-Zeichen,aber du könntest auch jeden anderen *char übergeben.

Und die Sache mit den Literalen wird eben zu einem Zeiger (*char)
aufgelöst,der String steht dann im sicherlich im Flash
(Mikrocontroller) und beim PC im Datensegment.Vernünftige Compiler
erzeugen übrigens den selben String nicht doppelt wenn 2x der selbe
Literal angegeben ist,es wird dann beim 2.Aufruf derselbe Zeiger wie
beim 1. übergeben

von Ronny (Gast)


Lesenswert?

Achja,war jetzt davon ausgegangen das klar ist,was "\n" unter C
erzeugt,nämlich CarriageReturn und LineFeed (0x0A/0x0D).Aber du hast
wieder Recht,man sollte nicht zuviel vorrausetzen ;)

Ich hab unter DOS mit Assembler angefangen zu lernen(selbst
Studium),daher nehm ich manches für selbstverständich,was es vielleicht
nicht ist

Gute Nacht,

Ronny

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

>Achja,war jetzt davon ausgegangen das klar ist,was "\n" unter C
>erzeugt,nämlich CarriageReturn und LineFeed (0x0A/0x0D).Aber du hast
>wieder Recht,man sollte nicht zuviel vorrausetzen ;)

Wie kommst du darauf das \n CarriageReturn und LineFeed "erzeugt".
Das sollte der C Compiler lieber nicht tun denn sonst würde ja
strlen("\n") 2 ergeben. Wenn sowas passiert (auf Betriebssystemen
einer bestimmten Herstellers) dann ist das die IO-Bibliothek die das
erzeugt aber nicht der C-Compiler.

Matthias

von Peter D. (peda)


Lesenswert?

> printf("start\n");
> Mein Lehrer meinte dies ist kein String doch was ist es dann?!?
> Er meinte ein String endet mit Nul also 00h.


Nun, das tut "start\n" auch, er soll einfach mal ins Binärfile
schauen, da wird er die 0 entdecken.

Das ist C-Standard, daß alles in "" eine 0 drangehängt bekommt.

Einzige Ausnahme ist, wenn dahinter nochmal was in "" kommt.
Man kann also bequem Texte in mehrere Zeilen schreiben:
1
char s[] = "hier kommt keine 0 ran\n"
2
           "hier auch nicht\n"
3
           "aber hier jetzt\n";

Peter

von Dietmar (Gast)


Lesenswert?

Also, der Text in printf() bekommt die 0 auch als Endekennzeichen.
Wie soll denn sonst printf() das Ende des Textes erkennen?

Gruß

Dietmar

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.