Die Bestimmung der Länge einer String-Literal
Gegeben ein array von Zeigern auf string-Literale:
char *textMessages[] = {
"Small text message",
"Slightly larger text message",
"A really large text message that "
"is spread over multiple lines"
}
Wie wird man bestimmt die Länge eines bestimmten string-literal - sagen die Dritten? Ich habe versucht, mit dem sizeof-Befehl wie folgt:
int size = sizeof(textMessages[2]);
Aber das Ergebnis scheint zu sein, die Anzahl der Zeiger im array, sondern als die Länge der string-literal.
sizeof(textMessages[2])
wird der Ertrag der Größe der char*
geben. Es ist rein zufällig, dass sizeof(char*)
geschieht, werden 4 auf Ihrem system, und nichts zu tun mit der Anzahl der Elemente im array.Sollten Sie mithilfe der definition
static const char textMesssages[][4]
für das array.Es gibt nur drei Zeiger im array (Hinweis: die string-Verkettung).
Naja, meinen Punkt nicht wirklich liegen, in der Wahl der Anzahl, obwohl ich würde befürworten, dass eine sentinel-Wert.
InformationsquelleAutor Zack | 2012-09-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn man die Zahl berechnet compile-Zeit (im Gegensatz zu den zur Laufzeit mit
strlen
), ist es vollkommen in Ordnung, einen Ausdruck verwenden, wieMöchten Sie vielleicht ein makro verwenden, um zu vermeiden, Wiederholung der long-literal, aber:
Beachten Sie, dass der zurückgegebene Wert von
sizeof
umfasst der terminierenden NULL, so ist eine mehr alsstrlen
.Mein Ansatz wäre, deklarieren und initialisieren Sie ein array von
struct { char *ptr; size_t len; } x[]
. Dann können Sie anrufenfoo(x[i].ptr, x[i].len)
. Da C nicht halten die string-Längen herum, es gibt keine andere Möglichkeit, als zu verfolgen, string-Längen in Ihrem code.InformationsquelleAutor Jens
Mein Vorschlag wäre die Verwendung von strlen und schalten Sie auf compiler-Optimierungen.
Z.B. mit gcc 4.7 auf x86:
Nach dem ausführen
make CFLAGS="-ggdb -O3" example.o
:I. e. der compiler ersetzt den Aufruf
strlen
mit den Konstanten Wert 0x3e = 62.Verschwenden Sie keine Zeit mit Optimierungen, die der compiler für Sie tun können!
InformationsquelleAutor privatepolly
strlen
vielleicht?Nicht, es sei denn, Sie kennen auch den string zur compile-Zeit.
ja, Sie wissen, die Länge zur compile-Zeit (die Frage sagt "String-Literal")
InformationsquelleAutor Tudor
Sollten Sie die
strlen()
Bibliothek Methode, um die Länge einer Zeichenkette.sizeof
geben Sie die Größe dertextMessages[2]
, ein Zeiger, der würde in der Maschine abhängig (4 bytes oder 8 bytes).gut, danke für die Korrektur 🙂
InformationsquelleAutor Vikdor
strlen Sie können die Länge der Zeichenfolge in der Erwägung, dass sizeof zurückkehren wird, die Größe der Daten Typ in Bytes, die Sie eingegeben haben, als parameter.
strlen
sizeof
InformationsquelleAutor Abhineet
Ich werde dir etwas sagen, nach meinem Wissen arrays ein Zeiger die gleiche Sache außer wenn Sie
sizeof
.Wenn Sie
sizeof
auf einen Zeiger wird es wieder immer 4 BYTE unabhängig von der Sache, die-Zeiger, aber wenn es von der verwendeten Arrays wird es wieder , Wie lange das array ist groß in bytes?.In Sie Beispiel hier
*textMessage[]
ist array von Zeiger so, wenn Siesizeof(textMessage[2])
wird es wieder 4 BYTE weiltextMessage[2]
ist ein Zeiger.Ich hoffe, es wird nützlich sein für Sie.
Meine Absicht war es zu sagen, Sie zu verbessern Sie Ihr wissen über die Unterschiede von arrays und Zeigern durch das Lesen von c-faq.com/aryptr/index.html Arrays sind keine Zeiger, und Sie sind oft 2 oder 8 statt 4 bytes, und Ihre Größe kann auch davon abhängen, welche Art Sie zeigen. Also, das meiste, was du geschrieben hast ist technisch falsch.
Okay danke @jens
Zeiger sind nicht immer 4 bytes.
InformationsquelleAutor Mahmoud Emam
Könnten Sie nutzen die Tatsache, dass die Werte in einem array hintereinander:
Die Größe ist bestimmt durch die Grenzen der Elemente. Der Raum zwischen dem Anfang der ersten und Anfang des zweiten Elements die Größe des ersten.
Dieser beinhaltet die Kündigung
\0
. Die Lösung, natürlich, funktioniert nur richtig mit Konstanten strings. Wenn die Saiten gewesen wäre Zeiger, die Sie erhalten würden, der die Größe eines Zeigers statt der Länge der Zeichenfolge.Das ist nicht garantiert, um zu arbeiten. Wenn die Felder ausgerichtet sind, kann dies yield falschen Größen und es können andere Einschränkungen eingeführt, durch den compiler, wie das Zusammenführen identische strings.
Auch benötigen Sie mindestens zwei Elemente im array.
Du hast Recht, Ausrichtung brechen würde diese (aber kontrollierbar). Verschiedene Größen für
char
brechen würde. Ich werde mark meine Antwort als nicht zuverlässig.Die Zusammenführung identischer Zeichenfolgen, eine gemeinsame Optimierung, auch bricht es.
InformationsquelleAutor nemo