Quand avez-vous besoin d'une chaîne terminée par null dans un scénario en lecture seule?

10

J'ai joué avec la std::string_viewbibliothèque et j'ai envisagé de changer une base de code sur laquelle je travaillais pour utiliser std::string_viewautant que possible. Cependant, dans de nombreux threads que j'ai lus sur le sujet de quand et où utiliser à la std::string_viewplace de const std::string &. J'ai vu de nombreuses réponses dire: «Lorsque vous n'avez pas besoin d'une chaîne terminée par un caractère nul». Alors, comme j'ai commencé à chercher sur le Web, "quand avez-vous besoin d'une chaîne terminée par un caractère nul?" Je n'ai pas vraiment trouvé de réponses utiles sur le sujet.

Je peux penser à un exemple de bibliothèque externe que vous lierez à qui nécessite un std::string. Et dans ce cas, vous auriez besoin d'une chaîne terminée par null puisque cette bibliothèque l'exige. Je suppose qu'un autre exemple serait si vous devez modifier la chaîne elle-même, mais nous ne la passerions pas const &si nous avions besoin de la modifier.

Alors, quand auriez-vous besoin d'utiliser une chaîne terminée par null?

Liens que j'ai consultés:

  1. Comment std :: string_view est-il plus rapide que const std :: string &?
  2. Quand passerais-je const & std :: string au lieu de std :: string_view?
  3. Pourquoi seulement l'affichage des chaînes?
  4. Est-il judicieux d'utiliser const std :: string & arguments en C ++ 17?
Sailanarmo
la source
5
Pour interfacer avec les API C, principalement.
noyer
@uneven_mark pouvez-vous en donner un exemple?
Sailanarmo
La réponse acceptée à la quatrième question que vous liez semble répondre à cette question.
François Andrieux
1
@Sailanarmo La plupart des fonctions de POSIX ou de toute autre bibliothèque C prenant par exemple un const char*argument. La réponse de eerorika a un exemple.
noyer
1
@ FrançoisAndrieux donc vraiment la réponse est: "Tant que l'API n'appelle pas une chaîne terminée par null?"
Sailanarmo

Réponses:

10

Quand avez-vous besoin d'une chaîne terminée par null?

Vous avez besoin d'une chaîne terminée par un caractère nul chaque fois que l'API que vous utilisez indique que vous en avez besoin. Cette exigence est omniprésente dans les interfaces C et n'est pas explicitement mentionnée dans certains documents. Si un argument de fonction est un char*(éventuellement à const) et qu'il n'y a pas d'argument de longueur, vous devez assumer l'exigence, sauf indication contraire de la documentation.

Prenons la fonction execve(du standard POSIX) comme exemple:

int execve(const char *pathname, char *const argv[], char *const envp[]);

Si vous passez un argument terminé non nul comme pathname, alors le comportement de votre programme sera indéfini.

eerorika
la source
Donc, dans ce cas, le chemin d'accès, si c'était un std::string, serait exécuté comme execve(pathname.c_str(),...,...)?
Sailanarmo
6

C'est en fait assez facile à savoir. Si vous appelez une fonction qui ne prend qu'une chaîne c ( char*/ const char*), vous avez besoin d'une chaîne terminée par un caractère nul car c'est le seul moyen de savoir où se trouve la fin de la chaîne.

Si vous avez à la place une fonction qui prend un char*/ const char*plus la taille, ou seulement deux pointeurs marquant le début et la fin des données, vous n'avez pas besoin d'une chaîne terminée par un caractère nul puisque vous avez / pouvez obtenir la taille de la chaîne sans itérer sur un terminateur nul.

NathanOliver
la source