Maison  >  Article  >  développement back-end  >  La `string::c_str()` de C 11 est-elle toujours terminée par un caractère nul ?

La `string::c_str()` de C 11 est-elle toujours terminée par un caractère nul ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-27 00:52:02236parcourir

Is C  11's `string::c_str()` Still Null-Terminated?

Le string::c_str() de C 11 élimine-t-il la terminaison nulle ?

En C 11, string::c_str n'est plus garanti produire une chaîne terminée par un caractère nul.

Raison :

En C 11, string::c_str est défini comme identique à string::data, qui à son tour est défini comme équivalent à *(begin() n) pour 0 <= n < taille(). La norme n'exige pas explicitement que la chaîne ait un caractère nul à sa fin.

Conséquences :

Cela implique que string::c_str() ne peut plus renvoyer une chaîne terminée par un caractère nul, entraînant des erreurs potentielles dans les scénarios qui supposent une telle terminaison.

Solution :

La solution consiste à utiliser string::c_str() uniquement pour compatibilité avec le code existant. Pour le nouveau code, utilisez plutôt string::data(). Bien que string::data() ne renvoie pas de chaîne terminée par un caractère nul, il renvoie un pointeur vers le tampon sous-jacent, dont la terminaison est garantie par un caractère nul en interne.

Détails de la mise en œuvre :

En interne, les chaînes doivent désormais utiliser des tampons terminés par un caractère nul. La définition de l'opérateur [] dans la section 21.4.5 nécessite que pour size() <= pos, l'opérateur renvoie une référence à un charT() avec la valeur ' ', appliquant ainsi les tampons terminés par un caractère nul.

Remarques supplémentaires :

  • &operator[](0) peut être utilisé comme synonyme de c_str().
  • Le caractère nul de fin doit se trouver dans le même buffer comme données de chaîne, car *(p size()) doit être égal à charT(). Ainsi, même si le caractère nul est initialisé paresseusement, il n'est pas possible d'observer le buffer dans un état intermédiaire.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn