@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
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.
> 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.
> Ob printf > diese dann an den UART schickt ist wieder eine andere Frage. Das tut er mit Sicherheit nicht.
@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
@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
@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.
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!
> 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 :-)
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
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
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
> 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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.