Diferenças entre sizeof Operator e função strlen para Strings em C++
-
as características do operador
sizeof
e cenários de uso -
Use a função de membro
std::string::size
para recuperar o número de caracteres em strings
Este artigo demonstrará várias diferenças ao usar o operador sizeof
em oposição à função strlen
com strings em C++.
as características do operador sizeof
e cenários de uso
O operador sizeof
é um operador unário que recupera o tamanho do armazenamento para a expressão ou tipo de dados fornecido. Este operador avalia o tamanho do objeto em unidades de bytes, e sizeof(char)
é garantidamente 1
.
Existe uma noção equivocada de que 1 byte sempre é igual a 8 bits e, conseqüentemente, podemos calcular o tamanho do objeto em bits. Na verdade, não é garantido que um byte tenha 8 bits pelo próprio idioma. Depende principalmente de uma plataforma de hardware subjacente. Ainda assim, a maioria dos hardwares de uso geral contemporâneos utiliza bytes de 8 bits.
Lembre-se de que o operador sizeof
não pode ser aplicado à expressão que inclui uma função ou um tipo incompleto ou campos de bits. No código de exemplo a seguir, aplicamos o operador sizeof
a duas matrizes de tipos diferentes e os resultados provavelmente serão os mesmos em sua plataforma também. Como o char
tem garantia de tamanho de 1 byte, a matriz de 20 caracteres ocupará 20 bytes.
Por outro lado, o tipo de dados long long
é definido pela implementação e, neste caso, passa a ter 8 bytes. Daí o tamanho total do array de 160 bytes. Observe que também podemos encontrar o número de elementos no array dividindo o array sizeof
inteiro pelo sizeof
de um elemento, como mostrado nas últimas linhas do próximo exemplo.
#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;
}
Produção:
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 o operador sizeof
para encontrar o comprimento da string está errado. Vamos considerar dois tipos de representação de strings em C++, uma string de caracteres e uma classe std::string
. O primeiro é acessado principalmente usando o ponteiro char
, e aplicando o sizeof
nele irá recuperar o tamanho de armazenamento do próprio ponteiro ao invés de toda a string.
Se tentarmos recuperar o tamanho do objeto std::string
usando o operador sizeof
, obtemos o tamanho do armazenamento do objeto, que não será o número de caracteres na string como demonstrado no trecho de código abaixo.
#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;
}
Produção:
sizeof char* : 8
sizeof string: 32
sizeof string.data: 8
Então temos a função strlen
, que é o resto da biblioteca de strings C. Ele calcula o comprimento da string de caracteres fornecida e a função retorna o número de bytes como valor integral. strlen
pode ser aplicado ao ponteiro char
onde uma string válida é armazenada ou ao valor retornado por std::string::c_str
, mas não deve ser a escolha do programador 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;
}
Produção:
strlen char* : 24
strlen string: 24
Use a função de membro std::string::size
para recuperar o número de caracteres em strings
Pelo contrário, o programador C++ deve utilizar a função membro size
da classe std::string
, pois oferece um método mais seguro para lidar com strings. Observe que podemos até usar a função de membro size
se tivermos uma cadeia de caracteres. Precisamos construir um novo objeto string
e invocar diretamente a função size
no valor retornado. O exemplo de código a seguir mostra o uso principal para ambos os cenários.
#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;
}
Produção:
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 Facebook