wchar_t String auf end of String Symbol testen

Programmiersprachen, APIs, Bibliotheken, Open Source Engines, Debugging, Quellcode Fehler und alles was mit praktischer Programmierung zu tun hat.
Antworten
BlueShark
Beiträge: 79
Registriert: 28.02.2009, 18:55
Alter Benutzername: BlueShark

wchar_t String auf end of String Symbol testen

Beitrag von BlueShark »

Moin moin,
ich fange gerade an, Multibyte Zeichen zu verwenden, um endlich Unicode in meine Programme rein zu bekommen. Nun frage ich mich aber, wie ich prüfen kann ob bei einem wchar_t String ein Terminierungszeichen vorhanden ist. Hier mein Beispiel:

Code: Alles auswählen

wchar_t string[6] = L"Hallo";
//testen ob Terminierungszeichen vorhanden
if(string[5] == L'\n'){
       cout << "success" << endl;
}
Dieser Code funktioniert nicht. Wie also muss ich das machen?

Vielen Dank im Voraus
BS
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: wchar_t String auf end of String Symbol testen

Beitrag von Aramis »

Das Terminierungszeichen ist eine binaere 0 (0x0000) und nicht ein Linefeed (0x0013), die passende Escape-Sequenz lautet L'\0'.
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: wchar_t String auf end of String Symbol testen

Beitrag von Krishty »

Besser direkt ::std::wstring benutzen.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
Aramis
Moderator
Beiträge: 1458
Registriert: 25.02.2009, 19:50
Echter Name: Alexander Gessler
Wohnort: 2016
Kontaktdaten:

Re: wchar_t String auf end of String Symbol testen

Beitrag von Aramis »

Naja, auch bei Verwendung eines std::wstring's wäre es hilfreich zu wissen wie der Terminator genau aussieht ... :-)
BlueShark
Beiträge: 79
Registriert: 28.02.2009, 18:55
Alter Benutzername: BlueShark

Re: wchar_t String auf end of String Symbol testen

Beitrag von BlueShark »

Oh Mann, ich liebe diese Community, immer schnelle Hilfe, egal bei was für Anfängerfragen.
Vielen vielen Dank^^.

Habt ihr vielleicht auch gleich nen Suchbegriff parat, falls ich noch mehr herausfinden will?

Gruß
BS
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: wchar_t String auf end of String Symbol testen

Beitrag von Krishty »

Aramis hat geschrieben:Naja, auch bei Verwendung eines std::wstring's wäre es hilfreich zu wissen wie der Terminator genau aussieht ... :-)
Warum? Wenn man String-Literale in den Code einbaut, fügt der Compiler den Terminator automatisch an. Will man die Länge oder Größe eines Strings wissen, benutzt man ::std::wstring::length(). Will man formatieren, benutzt man den operator += (), oder, für Komplexeres, ::std::wstringstream. Ich sehe nirgends einen Grund, sich mit dem Terminator zu befassen, außer vielleicht Neugierde.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Helmut
Establishment
Beiträge: 237
Registriert: 11.07.2002, 15:49
Wohnort: Bonn
Kontaktdaten:

Re: wchar_t String auf end of String Symbol testen

Beitrag von Helmut »

Nun, ein std::string kann auch mitten drin Terminator enthalten. Das wird in der Praxis sogar hin und wieder verwendet, zB bei den doppel nullterminierten Stringlisten.

*nerv*
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: wchar_t String auf end of String Symbol testen

Beitrag von Krishty »

Zunächst einmal sind Doppelnuller echte Fossilien, mit denen heute kaum noch jemand zu tun haben wird, wenn man nicht gerade direkt am Kernel werkelt ;)

Weiterhin sind doppelt nullterminierte Strings keine Strings, in denen mittendrin ein paar Nullen auftauchen, sondern Arrays von Strings, die mit einem leeren String abschließen (also zufälligerweise zwei Nullen enthalten). Man hat dort also genauso wenig auf einen Terminator zu prüfen wie überall auch, sondern stattdessen, ob die Länge eines Sub-Strings 0 ist.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: wchar_t String auf end of String Symbol testen

Beitrag von kimmi »

Krishty hat geschrieben:Zunächst einmal sind Doppelnuller echte Fossilien, mit denen heute kaum noch jemand zu tun haben wird, wenn man nicht gerade direkt am Kernel werkelt ;)

Weiterhin sind doppelt nullterminierte Strings keine Strings, in denen mittendrin ein paar Nullen auftauchen, sondern Arrays von Strings, die mit einem leeren String abschließen (also zufälligerweise zwei Nullen enthalten). Man hat dort also genauso wenig auf einen Terminator zu prüfen wie überall auch, sondern stattdessen, ob die Länge eines Sub-Strings 0 ist.
Es kann aber auch sein, daß man aufgrund einer nicht ganz so defensiven Programmierung versehentlich '\0' von einem Anwender des Codes irgendwo in den String eingefügt wurde. Dann stimmt plötzlich die Länge nicht mehr, da size() bz. lenght() jeweils nach '\0' sucht und der String als zu kurz angesehen wird ( nicht aber die capacity ). Das ist dann keine Absicht, aber als Fehler nicht auf Anhieb zu erkennen. Anders formuliert: ich hatte das schon :).

Gruß Kimmi
Benutzeravatar
Schrompf
Moderator
Beiträge: 4854
Registriert: 25.02.2009, 23:44
Benutzertext: Lernt nur selten dazu
Echter Name: Thomas Ziegenhagen
Wohnort: Dresden
Kontaktdaten:

Re: wchar_t String auf end of String Symbol testen

Beitrag von Schrompf »

Du redest jetzt aber nicht mehr von std::string oder wstring, oder? Die speichern die Länge nämlich intern und haben absolut kein Problem mit Nullchars im String. Wär ja noch schlimmer, wenn die bei jedem Aufruf von length() wieder die Bytes durchzählen.
Früher mal Dreamworlds. Früher mal Open Asset Import Library. Heutzutage nur noch so rumwursteln.
Benutzeravatar
kimmi
Moderator
Beiträge: 1405
Registriert: 26.02.2009, 09:42
Echter Name: Kim Kulling
Wohnort: Luebeck
Kontaktdaten:

Re: wchar_t String auf end of String Symbol testen

Beitrag von kimmi »

Doch, allerdings habe ich hier gezwungendermaßen eine ältere STL-Version vorliegen. Da sah ich das Phänomen. Allerdings kann es durchaus sein, daß der String unter der Hand noch wo umkopiert wurde, nachdem der '\0'-Terminierer eingebaut wurde ( das geschah per []-Operator ). Ich hatte an dem Gerät keinen Debugzugriff, um das durchzusteppen. Ich schau mal in die Implementierung, wie die das regeln.

Gruß Kimmi
Benutzeravatar
TGGC
Establishment
Beiträge: 569
Registriert: 15.05.2009, 18:14
Benutzertext: Ich _bin_ es.
Alter Benutzername: TGGC
Echter Name: Ich _bin_ es.
Wohnort: Mainz
Kontaktdaten:

Re: wchar_t String auf end of String Symbol testen

Beitrag von TGGC »

Krishty hat geschrieben:Zunächst einmal sind Doppelnuller echte Fossilien, mit denen heute kaum noch jemand zu tun haben wird, wenn man nicht gerade direkt am Kernel werkelt ;)
Ja, aber mit wchar_t und wstring hat das nichts zu tun. Interessant wird der Terminator z.b. sobald man den String mal den String als allgemeine Byte-Daten betrachten muss, weil man ihn binaer auf Platte speichert oder ueber Netzwerk verschickt. f'`8k


Gruß, TGGC (Was Gamestar sagt...)
Helmut
Establishment
Beiträge: 237
Registriert: 11.07.2002, 15:49
Wohnort: Bonn
Kontaktdaten:

Re: wchar_t String auf end of String Symbol testen

Beitrag von Helmut »

Krishty hat geschrieben:Zunächst einmal sind Doppelnuller echte Fossilien, mit denen heute kaum noch jemand zu tun haben wird, wenn man nicht gerade direkt am Kernel werkelt ;)

Weiterhin sind doppelt nullterminierte Strings keine Strings, in denen mittendrin ein paar Nullen auftauchen, sondern Arrays von Strings, die mit einem leeren String abschließen (also zufälligerweise zwei Nullen enthalten). Man hat dort also genauso wenig auf einen Terminator zu prüfen wie überall auch, sondern stattdessen, ob die Länge eines Sub-Strings 0 ist.
Naja, dass doppelt nullterminierte Strings Arrays von Strings sind wage ich doch sehr zu bezweifeln, aber du meinst sicher das richtige.:) Aber auch wenn ein doppelt-nulterminierter String nicht immer mit zwei Nullen endet kann man sowas in einem std::string speichern, wenn man will. Und dann muss man sehr wohl auf Terminator prüfen. Und es gibt eigentlich noch recht viele APIs, die sowas erwarten..

Ciao
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: wchar_t String auf end of String Symbol testen

Beitrag von Krishty »

Helmut hat geschrieben:Naja, dass doppelt nullterminierte Strings Arrays von Strings sind wage ich doch sehr zu bezweifeln, aber du meinst sicher das richtige.:)
Da bin ich mir irgendwie nicht mehr sicher ;) Kannst du mir genau erklären, was du unter doppelt nullterminierten Strings verstehst? Ich habe mich bis jetzt vor allem auf diese Erklärung gestützt („think of it as a packed array of null-terminated strings, with a zero-length string as the terminator“).
Helmut hat geschrieben:[…] auch wenn ein doppelt-nulterminierter String nicht immer mit zwei Nullen endet […]
Woher dann der Name?
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Helmut
Establishment
Beiträge: 237
Registriert: 11.07.2002, 15:49
Wohnort: Bonn
Kontaktdaten:

Re: wchar_t String auf end of String Symbol testen

Beitrag von Helmut »

Krishty hat geschrieben:
Helmut hat geschrieben:[…] auch wenn ein doppelt-nulterminierter String nicht immer mit zwei Nullen endet […]
Woher dann der Name?
Wenn du nicht schon den Link in deinem eigenen Beitrag hättest würde ich ihn jetzt posten ;) Da steht doch gerade drin, dass nicht jeder "Doppelnuller" (cooler Name;)) mit zwei Nullen endet. Der Name rührt schlicht und einfach daher, dass eine korrekte Formulierung viel zu lange ist.

Zum Thema Arrays, da hast du das Wort "packed" vergessen ;) Ein Array von C-Strings wäre char* bla[]. Also nur falsch formuliert, wie ich schon vermuttet hatte.
Benutzeravatar
Krishty
Establishment
Beiträge: 8238
Registriert: 26.02.2009, 11:18
Benutzertext: state is the enemy
Kontaktdaten:

Re: wchar_t String auf end of String Symbol testen

Beitrag von Krishty »

Helmut hat geschrieben:Der Name rührt schlicht und einfach daher, dass eine korrekte Formulierung viel zu lange ist.
Okay, das stimmt tatsächlich, wir haben also wirklich nur aneinander vorbei geredet :)

Aber ich bleibe dabei, dass man den Terminator auch bei der Arbeit mit Doppelnullern nicht direkt kennen muss, sondern mit der String-Länge arbeitet.
seziert Ace Combat, Driver, und S.T.A.L.K.E.R.   —   rendert Sterne
Antworten