Diferencias entre sizeof Operator y función strlen para cadenas en C++
-
El operador
sizeof
Características y escenarios de uso -
Utilice la función miembro
std::string::size
para recuperar el número de caracteres en cadenas
Este artículo demostrará múltiples diferencias cuando se usa el operador sizeof
en oposición a la función strlen
con cadenas en C++.
El operador sizeof
Características y escenarios de uso
El operador sizeof
es un operador unario que recupera el tamaño de almacenamiento para la expresión o tipo de datos dado. Este operador evalúa el tamaño del objeto en unidades de bytes, y se garantiza que sizeof(char)
es 1
.
Existe la idea equivocada de que 1 byte siempre es igual a 8 bits y, en consecuencia, podemos calcular el tamaño del objeto en bits. En realidad, el lenguaje en sí no garantiza que un byte sea de 8 bits. Depende principalmente de una plataforma de hardware subyacente. Aún así, la mayoría del hardware de propósito general actual utiliza bytes de 8 bits.
Tenga en cuenta que el operador sizeof
no se puede aplicar a la expresión que incluye una función o un tipo o campos de bits incompletos. En el siguiente código de ejemplo, aplicamos el operador sizeof
a dos matrices de diferentes tipos, y es probable que los resultados también sean los mismos en su plataforma. Dado que se garantiza que el char
tiene un tamaño de 1 byte, el array de 20 caracteres ocupará 20 bytes.
Por otro lado, el tipo de datos long long
está definido por la implementación y, en este caso, resulta ser de 8 bytes. De ahí el tamaño total del array de 160 bytes. Observe que también podemos encontrar el número de elementos en el array dividiendo el sizeof
toda el array por el sizeof
un elemento, como se muestra en las últimas líneas del siguiente ejemplo.
#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;
}
Producción :
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
Usar el operador sizeof
para encontrar la longitud de la cadena es incorrecto. Consideremos dos tipos de representación de cadenas en C++, una cadena de caracteres y una clase std::string
. Al primero se accede principalmente usando el puntero char
, y al aplicar el sizeof
en él se recuperará el tamaño de almacenamiento del puntero en sí en lugar de la cadena completa.
Si intentamos recuperar el tamaño del objeto std::string
usando el operador sizeof
, obtenemos el tamaño de almacenamiento del objeto, que no será el número de caracteres en la cadena como se muestra en el siguiente fragmento de código.
#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;
}
Producción :
sizeof char* : 8
sizeof string: 32
sizeof string.data: 8
Luego tenemos la función strlen
, que es el remanente de la biblioteca de cadenas de C. Calcula la longitud de la cadena de caracteres dada y la función devuelve el número de bytes como valor integral. strlen
se puede aplicar al puntero char
donde se almacena una cadena válida o al valor devuelto por std::string::c_str
, pero no debería ser la elección del programador de C++.
#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;
}
Producción :
strlen char* : 24
strlen string: 24
Utilice la función miembro std::string::size
para recuperar el número de caracteres en cadenas
Por el contrario, el programador de C++ debería utilizar la función miembro size
de la clase std::string
, ya que ofrece un método más seguro para manejar cadenas. Observe que incluso podemos usar la función miembro size
si tenemos una cadena de caracteres. Necesitamos construir un nuevo objeto string
e invocar directamente la función size
en el valor devuelto. El siguiente ejemplo de código muestra el uso principal para ambos escenarios.
#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;
}
Producción :
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 FacebookArtículo relacionado - C++ String
- Encuentre el primer carácter repetido en una cadena en C++
- Encuentre la subcadena común más larga en C++
- Poner en mayúscula la primera letra de una cadena en C++
- Comparación de cadenas y caracteres en C++
- Eliminar el último carácter de una cadena en C++
- Obtener el último carácter de una cadena en C++