Unterschiede zwischen sizeof-Operator und strlen-Funktion für Strings in C++
-
Der
sizeof
-Operator Merkmale und Anwendungsszenarien -
Verwendung von die Member-Funktion
std::string::size
zum Abrufen der Anzahl der Zeichen in Zeichenketten
Dieser Artikel zeigt mehrere Unterschiede bei der Verwendung des Operators sizeof
im Gegensatz zur Funktion strlen
mit Strings in C++.
Der sizeof
-Operator Merkmale und Anwendungsszenarien
Der Operator sizeof
ist ein unärer Operator, der die Speichergröße für den angegebenen Ausdruck oder Datentyp abruft. Dieser Operator wertet die Objektgröße in Byte-Einheiten aus und sizeof(char)
ist garantiert 1
.
Es gibt die falsche Vorstellung, dass 1 Byte immer 8 Bit entspricht, und folglich können wir die Größe des Objekts in Bit berechnen. Tatsächlich wird von der Sprache selbst nicht garantiert, dass ein Byte aus 8 Bit besteht. Es hängt hauptsächlich von einer zugrunde liegenden Hardwareplattform ab. Dennoch verwendet die meiste moderne Allzweck-Hardware 8-Bit-Bytes.
Beachten Sie, dass der Operator sizeof
nicht auf einen Ausdruck angewendet werden kann, der eine Funktion oder einen unvollständigen Typ oder Bitfelder enthält. Im folgenden Beispielcode wenden wir den Operator sizeof
auf zwei Arrays unterschiedlichen Typs an, und die Ergebnisse werden wahrscheinlich auch auf Ihrer Plattform gleich sein. Da das char
garantiert 1 Byte groß ist, nimmt das 20-Zeichen-Array 20 Byte ein.
Andererseits ist der Datentyp long long
implementierungsdefiniert und hat in diesem Fall 8 Bytes. Daher die gesamte Array-Größe von 160 Byte. Beachten Sie, dass wir die Anzahl der Elemente im Array auch finden können, indem wir die sizeof
des gesamten Arrays durch die sizeof
eines Elements dividieren, wie in den letzten Zeilen des nächsten Beispiels gezeigt.
#include <iostream>
using std::cout;
using std::endl;
int main() {
char arr[20];
long long arr2[20];
cout << "sizeof ( array of 20 long longs ) : " << sizeof arr << endl;
cout << "sizeof ( array of 20 long longs ) : " << sizeof arr2 << endl;
cout << "length of array of 20 chars) : "
<< ((sizeof arr) / (sizeof arr[0])) << endl;
cout << "length of array of 20 long longs ): "
<< ((sizeof arr2) / (sizeof arr2[0])) << endl;
return EXIT_SUCCESS;
}
Ausgabe:
sizeof ( array of 20 long longs ) : 20
sizeof ( array of 20 long longs ) : 160
length of array of 20 chars) : 20
length of array of 20 long longs ): 20
Die Verwendung des Operators sizeof
zum Ermitteln der Länge des Strings ist falsch. Betrachten wir zwei Darstellungsarten von Strings in C++, eine Zeichenkette und eine std::string
-Klasse. Auf erstere wird meistens mit dem Zeiger char
zugegriffen, und das Anwenden von sizeof
darauf ruft die Speichergröße des Zeigers selbst und nicht den gesamten String ab.
Wenn wir versuchen, die Größe des Objekts std::string
mit dem Operator sizeof
abzurufen, erhalten wir die Speichergröße des Objekts, die nicht der Anzahl der Zeichen im String entspricht, wie im folgenden Code-Snippet gezeigt.
#include <cstring>
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
int main() {
const char *text1 = "arbitrary string value 1";
string text2 = "arbitrary string value 2";
cout << "sizeof char* : " << sizeof text1 << endl;
cout << "sizeof string: " << sizeof text2 << endl;
cout << "sizeof string.data: " << sizeof text2.data() << endl;
return EXIT_SUCCESS;
}
Ausgabe:
sizeof char* : 8
sizeof string: 32
sizeof string.data: 8
Dann haben wir die Funktion strlen
, das Überbleibsel der C-String-Bibliothek. Sie berechnet die Länge der gegebenen Zeichenkette und die Funktion gibt die Anzahl der Bytes als ganzzahligen Wert zurück. strlen
kann auf den char
-Zeiger angewendet werden, in dem ein gültiger String gespeichert ist, oder auf den von std::string::c_str
zurückgegebenen Wert, aber es sollte nicht die Wahl des C++-Programmierers sein.
#include <cstring>
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
int main() {
const char *text1 = "arbitrary string value 1";
string text2 = "arbitrary string value 2";
cout << "strlen char* : " << strlen(text1) << endl;
cout << "strlen string: " << strlen(text2.c_str()) << endl;
return EXIT_SUCCESS;
}
Ausgabe:
strlen char* : 24
strlen string: 24
Verwendung von die Member-Funktion std::string::size
zum Abrufen der Anzahl der Zeichen in Zeichenketten
Im Gegenteil, der C++-Programmierer sollte die Memberfunktion size
der Klasse std::string
verwenden, da sie eine sicherere Methode für den Umgang mit Strings bietet. Beachten Sie, dass wir die Memberfunktion size
sogar verwenden können, wenn wir eine Zeichenkette haben. Wir müssen ein neues string
-Objekt konstruieren und direkt die size
-Funktion für den zurückgegebenen Wert aufrufen. Das folgende Codebeispiel zeigt die primäre Verwendung für beide Szenarien.
#include <cstring>
#include <iostream>
#include <string>
using std::cout;
using std::endl;
using std::string;
int main() {
const char *text1 = "arbitrary string value 1";
string text2 = "arbitrary string value 2";
cout << "length char* : " << string(text1).size() << endl;
cout << "length string: " << text2.size() << endl;
return EXIT_SUCCESS;
}
Ausgabe:
length char* : 24
length string: 24
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn FacebookVerwandter Artikel - C++ String
- Finden Sie das erste sich wiederholende Zeichen in einer Zeichenfolge in C++
- Finden Sie die längste gemeinsame Teilzeichenfolge in C++
- Großschreiben des ersten Buchstabens einer Zeichenfolge in C++
- Vergleich von String und Character in C++
- Entfernen Sie das letzte Zeichen aus einer Zeichenkette in C++
- Abrufen des letzten Zeichens einer Zeichenkette in C++