4 Stimmen

Hat jemand einen Ersatz für string.h mit einer Struktur zum Speichern der Zeichenfolge und Länge implementiert?

In der C-Standardbibliothek werden Zeichenketten durch ein Array von Zeichen implementiert, das durch ein Nullzeichen abgeschlossen wird: ' \0 '. Solche ASCIZ-Zeichenketten führen zu Ineffizienz, weil wir jedes Mal, wenn wir die Länge einer Zeichenkette wissen müssen, diese iterieren müssen, um nach ' \0 '.

Dies kann umgangen werden, indem die Länge der Zeichenkette bei der Erstellung gespeichert wird, z. B. durch Verwendung einer Struktur wie folgt:

typedef struct cstring_ {
    size_t nchars;
    char chars[0];
} cstring;

Hat jemand eine freigegebene Bibliothek, die die string.h-Funktionen implementiert, aber mit einer Struktur anstelle von char * Schnüre weitergeben?

Wenn nicht, gibt es einen bestimmten Grund, warum dies eine schlechte Idee wäre?

5voto

Mat Punkte 195740

Davon gibt es wahrscheinlich Dutzende. Schauen Sie sich an Glibs GString zum Beispiel.

3voto

paercebal Punkte 78198

Hat jemand eine freigegebene Bibliothek, die die string.h-Funktionen implementiert, aber mit einer Struktur anstelle von char * Schnüre weitergeben?

Das habe ich.

Vor 11 Jahren, als ich C lernte, habe ich die gesamte <string.h>-Bibliothek neu implementiert und dafür gesorgt, dass Reallokationen verwendet wurden, wenn mehr Platz in der Zeichenkette benötigt wurde.

Aber damals war es zu Lernzwecken (seitdem bin ich zu C++ gewechselt und verwende jetzt std::string).

Gibt es einen bestimmten Grund, warum dies eine schlechte Idee wäre?

Ich denke, es kann eine gute Idee sein, es selbst zu versuchen: Auf diese Weise können Sie sich mit der richtigen API sowohl die Länge der Zeichenkette als auch die Größe des Puffers und vielleicht sogar einen Referenzzähler merken, wenn Sie mit Copy-on-Write-Konzepten spielen wollen. Ihre Zeichenkette wird komplexer, aber in einigen Fällen effizienter sein als die Standardzeichenkette. Und das ist eine gute Lernerfahrung.

Aber für die Produktion Code, wie immer, entweder Sie sind sehr sehr erfahren, oder Sie sollten versuchen, eine Bibliothek, die das besser als Sie tun wird zu finden.

Ich kenne einige produktionsreife Implementierungen, die diese alternative Zeichenfolge verwenden.

Matte bereits den GString der GLib erwähnt.

Wenn Sie für Windows programmieren, können Sie mit Microsofts BSTR (und sein C++-Wrapper bstr_t ) könnten Ihr Problem lösen: Sie können wie ein const char * Zeichenfolge, und sie verwenden SysAllocString und ihre Schwesterfunktionen, SysFreeString , usw..

Sie können sie für Produktionscode verwenden oder zu Lernzwecken von ihnen lernen.

1voto

cnicutar Punkte 173420

Von der C FAQ

Trotz ihrer Beliebtheit ist die Technik auch etwas berüchtigt: Dennis Ritchie bezeichnete sie als ``ungerechtfertigte Anbiederung an die C Implementierung,'' und eine offizielle Interpretation hat sie als nicht streng mit dem C Norm obwohl es den Anschein hat unter allen bekannten Implementierungen zu funktionieren scheint. (Compiler, die Array-Grenzen sorgfältig prüfen sorgfältig prüfen, könnten Warnungen ausgeben.)

Ich denke auch, dass es lauten sollte char chars[1]; .

1voto

Fred Foo Punkte 341230

Ja, es gibt eine Reihe von Bibliotheken, die dies tun, einschließlich Glattes , BString , VStr und andere. Das Problem ist, dass sie in der Regel ziemlich umständlich zu bedienen sind, oder zumindest erfordern das Erlernen von Nicht-Standard-APIs, um Strings zu behandeln. (C++'s std::string wäre ein Beispiel für die richtige Handhabung von Zeichenketten, aber es hängt von vielen C++-Funktionen ab).

Wenn Sie Angst vor den Kosten für strlen zu verwenden, sollten Sie die Länge der Zeichenkette "manuell" berechnen, während Sie Operationen mit ihnen durchführen, und die meisten Operationen mit memcpy und direkten Zugang zu den Zeichen. Das ist allerdings nur in engen Schleifen sinnvoll.

0voto

Nickolay Olshevsky Punkte 12838

Ich habe etwas Ähnliches in einem meiner Projekte implementiert (allerdings habe ich class anstelle von struct verwendet). Es ist einfach zu implementieren. Es ist auch eine gute Idee, alles, einschließlich der Länge, in einem Speicherbereich zu speichern und eine Zeichenkette als Zeiger auf den Anfang der Zeichenkettendaten selbst darzustellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X