1
votes

Pourquoi avons-nous besoin d'un terminateur nul dans les chaînes C ++?

Je suis nouveau en programmation et très nouveau en C ++, et je suis récemment tombé sur des chaînes.

Pourquoi avons-nous besoin d'un terminateur nul à la fin d'une liste de caractères?

J'ai lu des réponses comme étant donné que nous pourrions ne pas utiliser tous les espaces d'un tableau, nous avons donc besoin du terminateur nul pour que le programme sache où la chaîne se termine, par exemple. char [100] = "Jean" mais pourquoi le programme ne peut-il pas simplement parcourir le tableau pour vérifier combien d'espaces sont remplis et donc décider de la longueur?

Et si seulement quatre caractères sont remplis dans le tableau pour le mot "John" , quels sont les autres espaces remplis?


3 commentaires

@ S.M. Fermer mais pas de double IMO. Cette autre question posée sur null s'est terminée comme une alternative pour la longueur préfixée.


Il y a une réponse donnée par l'auteur de C, Dennis M Ritchie, en dessous de cette question.


En réponse à la question «Pourquoi le programme ne peut-il pas vérifier le nombre d'espaces remplis»: que signifie exactement «vérifier combien d'espaces sont remplis»? La mémoire est toujours remplie de quelque chose. C'est comme demander "vérifier si cette boîte contient quelque chose". Eh bien, une boîte a toujours quelque chose à l'intérieur, c'est-à-dire l'air. Et 0 en C ++ joue le rôle de l'air.


3 Réponses :


3
votes

Les autres caractères du tableau char john [100] = "John" seraient remplis de zéros, qui sont tous null- terminateurs. En général, lorsque vous initialisez un tableau et que vous ne fournissez pas suffisamment d'éléments pour le remplir, les éléments restants sont initialisés par défaut:

int foo[3] {5};           // this is {5, 0, 0}
int bar[3] {};            // this is {0, 0, 0}

char john[5] = "John";    // this is {'J', 'o', 'h', 'n', 0}
char peter[5] = "Peter";  // ERROR, initializer string too long
                          // (one null-terminator is mandatory)

Voir également cppreference lors de l'initialisation du tableau . Pour trouver la longueur d'une telle chaîne, nous faisons une boucle sur les caractères jusqu'à ce que nous trouvions 0 et quittons.

La motivation derrière les chaînes de terminaison nul en C ++ est d'assurer la compatibilité avec Bibliothèques C qui utilisent une chaîne terminée par NULL. Voir également Quelle est la justification des chaînes terminées par null?

Conteneurs tels que std :: string ne nécessite pas que la chaîne soit terminée par un NULL et peut même stocker une chaîne contenant des caractères NULL. C'est parce qu'ils stockent la taille de la chaîne séparément. C ++ - seules les bibliothèques utiliseront rarement - si jamais - des chaînes terminées par NULL.


4 commentaires

Merci beaucoup pour la réponse. Cependant, si 0 est le terminateur nul, que se passe-t-il quand il y a un élément 0 dans un tableau int?


@NewbieToCoding int n'est pas un char et n'est pas quelque chose à partir duquel vous pouvez construire une chaîne. Vous utiliseriez plutôt int pour les applications numériques.


Merci. D'après ce que j'ai lu, le terminateur nul est '\ 0' ?


@NewbieToCoding oui, dans les jeux de caractères ASCII et UTF, 0 représente le caractère NULL , qui signale la fin de la chaîne.



0
votes

L'existence d'un terminateur nul est une décision de conception. Le but qu'il sert est de marquer la fin de la chaîne. Il y a d'autres façons de faire cela, par exemple en Pascal, le premier élément d'une chaîne est sa taille, donc aucun terminateur nul n'est nécessaire.

Dans l'exemple que vous donnez, seuls les 5 premiers éléments du tableau seront initialisés, les autres sont initialisés à zéro. Remarquez comment j'ai dit 5 éléments et pas seulement quatre. Le cinquième élément est le terminateur nul.

Bien sûr, le programme peut parcourir la chaîne pour connaître sa longueur, mais comment saura-t-il quand arrêter la boucle?


1 commentaires

"le reste contient des valeurs de déchets" . Non, les autres sont initialisés par défaut, ce qui pour les types numériques signifie initialisé à zéro. Voir Initialisation de tableau .



0
votes

Le terminateur nul est ce qui vous indique quels espaces sont remplis. Tout jusqu'à et y compris le terminateur nul a été rempli. Tout ce qui n'est pas après.

Il n'y a pas de notion générale des éléments d'un tableau qui ont été remplis. Un tableau contient un certain nombre d'éléments; sa taille est déterminée lors de sa création. Tous ses éléments ont une certaine valeur au départ; il n'y a aucun moyen, en général, de déterminer lesquels ont reçu une valeur et lesquels n'ont pas de valeur en regardant les valeurs des éléments.

Les chaînes sont des tableaux de char et une convention de codage selon laquelle la "fin" de la chaîne est marquée par un caractère nul. La plupart des fonctions de manipulation de chaînes reposent sur cette convention.

Un littéral de chaîne, tel que "John" , est un tableau de char . "John" a 5 éléments dans le tableau: 'J' , 'o' , 'h' , 'n' , '\ 0' . La fonction strcpy , par exemple, copie des caractères jusqu'à ce qu'elle voit ce terminateur nul:

char result[100]; // no meaningful values here
strcpy(result, "John");

Après l'appel à strcpy , les cinq premiers éléments du résultat sont 'J' , 'o' , 'h' , 'n' et '\ 0' . Le reste des éléments du tableau n'a pas de valeurs significatives.

Je m'en voudrais de ne pas mentionner que ce style de chaîne vient de C, et est souvent appelé chaînes de style C. C ++ prend en charge toutes les chaînes de caractères C, mais il a également une notion plus sophistiquée de chaîne, std :: string , qui est complètement différente. En général, vous devriez utiliser des chaînes de style C ++ et non des chaînes de style C.


0 commentaires