Je viens de commencer la lecture de C++, et je suis tombé sur un terme "chaîne terminée par Null", je l'ai lu mais je ne pouvais pas comprendre ce qu'il représente réellement.
Je veux également savoir quelle est la différence entre une chaîne c (également appelée "chaîne terminée par Null") et une chaîne c ++.
Réponse courte: une chaîne terminée par un caractère nul est un tableau de caractères avec une valeur nulle (0x00) après le dernier caractère valide de la chaîne.
Longue réponse:
Il est important de se rappeler que tous les compilateurs C et C++ n'initialiseront pas de valeurs pour vous. AFAIK, la plupart n'en ont pas.
Une chaîne de base en C ou C++ (sans STL) est simplement un tableau de caractères.
char myString[25];
À ce stade, nous n'avons aucune idée de ce qui se trouve dans cette chaîne. Il pourrait être vide; il pourrait avoir des caractères inutiles (très probablement); ou il pourrait avoir des informations utiles. Tout dépend de ce qui était dans ce segment de mémoire avant la déclaration du tableau.
Notez que nous avons 24 caractères de stockage ici, et le null prendra le 25ème caractère.
Il est courant de pré-remplir et d'effacer une chaîne avec des valeurs nulles pour se débarrasser de tous les déchets.
memset(myString, 0x00, 25);
Notez que dans ce cas, j'utilise une déclaration hexadécimale de 0 pour indiquer NULL. Certains compilateurs et/ou bibliothèques ont une valeur NULL
ou similaire définie.
De nombreuses fonctions de chaîne de base comme strcmp
, strcat
, etc ... reposent sur des chaînes terminées par null pour indiquer la fin de la chaîne. Si vous ne l'avez pas terminé, la fonction de chaîne peut s'exécuter à la fin de la chaîne et ne pas agir comme prévu.
La chaîne C++ STL est un objet réel et prend en charge certaines de ces préoccupations d'initialisation/terminaison pour vous.
En programmation informatique, une chaîne terminée par un caractère nul est une chaîne de caractères stockée sous forme de tableau contenant les caractères et terminée par un caractère nul ('\ 0', appelé NUL en ASCII).
Il y a d'excellentes réponses dans ce fil, mais j'aimerais en ajouter une destinée à une personne qui a appris la programmation informatique à partir d'un langage fortement typé comme Java ou C #, et jamais programmé en un langage faiblement typé comme C ou C++.
(Notez que je parle de typage fort vs faible, pas de typage dynamique vs statique. La définition exacte de typage faible est une discussion fascinante en soi, mais en dehors du cadre de cette réponse :)
Pour comprendre les chaînes terminées par zéro, nous devons commencer par la façon dont les données sont stockées dans des systèmes faiblement typés. Dans ces systèmes, la mémoire entière n'est qu'une grande séquence d'octets et le programme a accès à n'importe lequel de ces octets à tout moment. C'est au programme d'interpréter correctement les octets. Par exemple, lorsque le programme doit lire un entier 32 bits à l'adresse A1, il lit 4 octets à partir de l'adresse A1 et les interprète comme un seul entier 32 bits. Il sait que l'entier 32 bits a une taille de 4 octets, il n'a donc pas besoin d'avoir de marqueur pour savoir où se termine l'entier.
Cela n'est pas vrai pour les chaînes de texte, qui dans la plupart des langues peuvent être de taille arbitraire et sont représentées par un seul octet par caractère (ou 2 octets pour les chaînes UNICODE). Ainsi, connaître l'adresse de début d'une chaîne ne signifie pas que le programme sait où se termine la chaîne. Gardez à l'esprit - dans les langues faiblement typées, rien n'empêche le programme de lire la mémoire au-delà de la fin de la chaîne et continuez d'interpréter les octets qui représentent les données stockées derrière la chaîne comme des caractères supplémentaires.
Ainsi, pour lire une chaîne de texte à l'adresse A2, le programme a besoin d'un moyen de savoir combien de temps la chaîne est, afin qu'il sache combien d'octets il doit lire. Certaines langues le traiteront en stockant la taille de la chaîne de texte dans le premier octet (ou 2 ou même 4 octets). Une chaîne "foo" peut faire 4 octets et ressembler à ceci:
3 102 111 111
où 3 est la longueur de la chaîne et 102 et 111 sont ASCII codes pour les caractères 'f' et 'o'. Ceci est assez simple, mais limite la longueur maximale de toute chaîne, en ce cas à 255 caractères (puisque 255 est la valeur entière maximale qui peut être stockée dans un seul octet, nous avons utilisé pour conserver la longueur de la chaîne).
Une autre façon de résoudre ce problème consiste à marquer la fin de la chaîne, et c'est exactement ce que fait une chaîne terminée par un caractère nul. Il utilise un caractère NULL représenté par ASCII valeur de 0 (zéro). La même chaîne "foo" pourrait donc ressembler à ceci:
102 111 111 0
Notez que dans ce cas, il n'y a pas de limite pour la longueur d'une chaîne qui peut être représentée dans ce format et le surdébit de la représentation est toujours exactement d'un octet (le zéro du fleuron). De toute évidence, les chaînes de texte contenant le caractère NULL ne peuvent pas du tout être représentées comme des chaînes terminées par null.
Les chaînes terminées par des caractères nuls ne sont pas similaires aux chaînes dans la plupart des autres langues. Ils sont la manière standard de représenter les chaînes en C, rien de plus qu'un tableau de caractères dans un ordre séquentiel. Dans un langage comme C++, une chaîne est un objet réel avec des paramètres et des trucs.
Le problème avec ce tableau de caractères est, comment savoir quand arrêter de lire, où se trouve la fin de la chaîne? Étant donné que le caractère nul n'est utilisé pour rien d'autre, il est utilisé pour terminer la chaîne, c'est-à-dire marquer le point de terminaison.
Pour répondre à la deuxième question en premier, une chaîne C++ - est une instance de la classe std::string
qui fait partie de la bibliothèque standard C++.
Une chaîne c (ou une chaîne de style c ou une chaîne terminée par NUL) est une séquence de caractères qui se termine au premier '\0'
(ASCII NUL).
Une différence importante est qu'un std::string
peut contenir des caractères NUL incorporés dans son contenu, mais une chaîne de style C par définition ne peut pas (car elle se termine au premier caractère NUL).
Ainsi, le terme "chaîne terminée par NUL" (souvent "mal orthographié" comme terminé par un caractère nul) vient du fait qu'une telle chaîne se termine par (est terminée par) un NUL ('\0'
) personnage.
Une chaîne terminée par un caractère nul est une séquence de caractères avec un caractère de fin à 0. Donc une chaîne comme "Hi"
est représenté par la séquence {72, 105, 0}
(ASCII). Le 0 est une valeur sentinelle qui indique la fin de la chaîne. Les fonctions de bibliothèque de chaînes C (strcmp
, strcpy
, etc.) reposent sur la présence de cet octet 0 pour fonctionner correctement.
Ceci est différent de Pascal ou des chaînes BASIC old-school qui stockaient la longueur de chaîne dans l'octet de tête ({2, 72, 105}
).
En C, les chaînes sont stockées dans des tableaux de char
.
La classe C++ string
utilise des chaînes à terminaison nulle sous le capot (au moins dans les implémentations que je connais), mais son interface est telle que vous n'avez normalement pas à vous soucier de ce niveau de détail.