Différences entre l'opérateur sizeof et la fonction strlen pour les chaînes en C++

Jinku Hu 12 octobre 2023
  1. Caractéristiques de l’opérateur sizeof et scénarios d’utilisation
  2. Utilisez la fonction membre std::string::size pour récupérer le nombre de caractères dans les chaînes
Différences entre l'opérateur sizeof et la fonction strlen pour les chaînes en C++

Cet article démontrera plusieurs différences lors de l’utilisation de l’opérateur sizeof par opposition à la fonction strlen avec des chaînes en C++.

Caractéristiques de l’opérateur sizeof et scénarios d’utilisation

L’opérateur sizeof est un opérateur unaire qui récupère la taille de stockage pour l’expression ou le type de données donné. Cet opérateur évalue la taille de l’objet en unités d’octet, et sizeof(char) est garanti être 1.

Il existe une idée erronée selon laquelle 1 octet équivaut toujours à 8 bits et, par conséquent, nous pouvons calculer la taille de l’objet en bits. En fait, un octet n’est pas garanti comme étant 8 bits par le langage lui-même. Cela dépend principalement d’une plate-forme matérielle sous-jacente. Pourtant, la plupart des matériels à usage général contemporains utilisent des octets 8 bits.

N’oubliez pas que l’opérateur sizeof ne peut pas être appliqué à l’expression qui inclut une fonction ou un type incomplet ou des champs de bits. Dans l’exemple de code suivant, nous appliquons l’opérateur sizeof à deux tableaux de types différents, et les résultats seront probablement les mêmes sur votre plate-forme également. Étant donné que le char est garanti d’avoir une taille de 1 octet, un tableau de 20 caractères occupera 20 octets.

D’un autre côté, le type de données long long est défini par l’implémentation, et dans ce cas, il s’agit de 8 octets. D’où la taille totale du tableau de 160 octets. Notez que nous pouvons également trouver le nombre d’éléments dans le tableau en divisant le tableau entier sizeof par le sizeof un élément, comme indiqué sur les dernières lignes de l’exemple suivant.

#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;
}

Production:

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

L’utilisation de l’opérateur sizeof pour trouver la longueur de la chaîne est erronée. Considérons deux types de représentation des chaînes en C++, une chaîne de caractères et une classe std::string. Le premier est principalement accessible à l’aide du pointeur char, et l’application du sizeof sur celui-ci récupérera la taille de stockage du pointeur lui-même plutôt que la chaîne entière.

Si nous essayons de récupérer la taille de l’objet std::string à l’aide de l’opérateur sizeof, nous obtenons la taille de stockage de l’objet, qui ne sera pas le nombre de caractères de la chaîne comme illustré dans l’extrait de code ci-dessous.

#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;
}

Production:

sizeof char* : 8
sizeof string: 32
sizeof string.data: 8

Ensuite, nous avons la fonction strlen, qui est le vestige de la bibliothèque de chaînes C. Elle calcule la longueur de la chaîne de caractères donnée et la fonction renvoie le nombre d’octets sous forme de valeur intégrale. strlen peut être appliqué au pointeur char où une chaîne valide est stockée ou à la valeur renvoyée par std::string::c_str, mais cela ne devrait pas être le choix du programmeur 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;
}

Production:

strlen char* : 24
strlen string: 24

Utilisez la fonction membre std::string::size pour récupérer le nombre de caractères dans les chaînes

Au contraire, le programmeur C++ devrait utiliser la fonction membre size de la classe std::string, car elle offre une méthode plus sûre pour gérer les chaînes. Notez que nous pouvons même utiliser la fonction membre size si nous avons une chaîne de caractères. Nous devons construire un nouvel objet string et invoquer directement la fonction size sur la valeur renvoyée. L’exemple de code suivant montre l’utilisation principale pour les deux scénarios.

#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;
}

Production:

length char* : 24
length string: 24
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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

Article connexe - C++ String