'\0' am Ende eines strings entfernen?

Herakles

Profifragensteller
Moin!

Ergibt es irgendeinen Sinn, bei einem string das '\0' am Ende wegzulassen?

Davon abgesehen, sprintf und snprintf usw. setzen ohnehin automatisch immer ein '\0' ans Ende. Wenn ich das händisch wieder herauslösche ergibt sich daraus ein Sinn (außer die Ersparnis eines Bytes)?

Ich schicke einen ASCII-string über das Netzwerk und bei meinem Testprogramm will ich mit

Code:
printf("%s\n",ascii-string);

die Ausgabe meines Strings erwirken. Das läuft natürlich nicht, wenn kein '\0' am Ende zur Verfügung steht. Kann sich irgendwer vorstellen, ob und warum jemand dieses '\0' am Ende weglassen wollte, vorausgesetzt er interpretiert die Daten nicht wie ich in dem CODE da oben?

Danke für Eure Gedanken zum Thema,

Herakles
 
Mir ist deine Fragestellung nicht wirklich klar. Eine Zeichenkette in C definiert sich genau über das abschließende NUL (\0). Eine Reihung von chars, die nicht mit einem NUL abgeschlossen ist, ist keine Zeichenkette und Verwendung als solche führt (bis auf ein paar Ausnahmen) zu undefiniertem Verhalten. Z.B. tut strlen() nichts anderes als NUL zu suchen und dabei die Anzahl der Zeichen mitzuzählen. Fehlt das NUL, so liest strlen() fröhlich weiter und es passiert Beliebiges (meistens trifft es dann irgendwo im Speicher auf ein Byte mit Wert 0 und liefert dann eine unsinnige Länge oder es passiert ein Speicherzugriffsfehler). Somit ist das NUL am Ende ein essentieller Bestandteil einer Zeichenkette in C.
Zeichenketten übers Netzwerk schicken ist wieder eine andere Sache: Auf Empfängerseite handelt es sich um eine zunächst unkontrollierte Eingabe und sollte als solche behandelt werden. Ein defektes Paket oder jemand Böswilliges könnte eine Zeichenkette ohne NUL verursachen. Es muss also streng geprüft werden, ob die Eingabe korrekt ist. So könnte das Protokoll vorschreiben, zunächst eine Länge zu schicken und dann die Zeichen. Ein NUL wäre dann sinnlos, da der Empfänger sowieso prüfen müsste, ob es vorhanden ist und gegebenenfalls dieses ergänzen. Dann kann man es auch gleich nicht schicken und der Empfänger ergänzt immer ein NUL. Eine zweite Möglichkeit ist, eine Zeichenkette ohne vorherige Längenangabe zu schicken und NUL als Endemarke zu verwenden. Hier ist darauf zu achten, beim Lesen eine sinnvolle Obergrenze zu setzen, sonst geht einem irgendwann der Speicher aus, wenn kein NUL kommt (Natürlich ist auch bei vorheriger Längenange eine sinnvolle Grenze zu setzen, aber hier kann dies im Vorraus geschehen statt während des Einlesens der Zeichenkette).
Möglicherweise hilft dir das weiter.
 
Zuletzt bearbeitet:
Hi,

\0 ist für das interne String-Handling unter C unumgänglich, da Strings "nur" char-Arrays sind und die str*-Funktionen sonst das Ende des Strings nicht erkennen könnten, was du sicher weisst.

Bei der Ausgabe des Strings darf und wird \0 nicht mit ausgegeben (hab es eben getestet).

Elwood
 
Ich glaube das ist Herakles alles schon bewusst. Die Fragestellung war zusammengefasst: "Jemand hat mir/könnte mir einen String ohne abschliessendes '\0' geschickt/schicken. Kanns sich irgendwer zusammenreimen ob dies irgendwelche Auswirkungen haben könnte?".

Vielleicht ist es zuweit hergeholt aber evtl. wollte er Speicher auslesen. Es kommt darauf an was mit diesem String passiert. Wenn er z.B. zurückgeschickt wird könnte es sein dass er mehr zurückbekommt als er geschickt hat. Eben von Anfang dieses Strings bis zum nächsten '\0'. Nur mal ins Blaue geraten. Kann das sein?

Viele Grüße
 
Danke für die Antworten. Ich wollte lediglich, dass sich auch jemand anders mal über die Plausibilität Gedanken macht, was hiermit geschehen ist. Vielen Dank an Euch alle!!!

Herakles
 
Normalerweise schickt man das \0 nicht über den Socket in die Welt, das \0 gehört zur Datenstruktur und ist kein Datum.
 
Morgen

Ein '\0' dient dazu, dass das String dadurch endet. Dessen nutzen sieht man in einiegen Funktionen. Diese Funktionen intepretieren eifach '\0' als ende des Strings. Natürlich kann mehr auch ohne '\0' arbeiten, dabei gibts bsp. strncmp, wo halt die String länge direkt angegeben werden muss. Somit bleibt das '\0' weg. Doch aus eifachheit, mach das '\0' halt für einiege aufgaben sinn und für anderen halt eher die direkte String längen angabe.

Gruss
bsdagent

P.S.: Wobei sich allgemein wegen sicherer programmierung die string länge angabe durchgesetzt hat, egal ob '\0' oder nicht. Dies zeigt sich bsp. bei C++ klassen die ein String darstellen. Dort wird bsp. eine Variable SIZE mit der länge des Strings initialisiert. Siehe QByteArray oder QString.
 
Zuletzt bearbeitet:
Zurück
Oben