Dans un cours d'introduction de C, j'ai appris que tout en stockant les chaînes sont stockées avec un caractère nul \0
à la fin de celui-ci. Mais que se passe-t-il si je voulais imprimer une chaîne, disons printf("hello")
bien que j'ai trouvé que cela ne se termine pas \0
par la déclaration suivante
printf("%d", printf("hello"));
Output: 5
mais cela semble incohérent, pour autant que je sache que les chaînes de type variable sont stockées dans la mémoire principale et je suppose qu'en imprimant quelque chose, elles peuvent également être stockées dans la mémoire principale, alors pourquoi la différence?
);
, qu'avez-vous l'intention de montrer avec ce code? Comment avez-vous prouvé que cela ne se termine pas par un\0
?Réponses:
L'octet nul marque la fin d'une chaîne. Il n'est pas compté dans la longueur de la chaîne et n'est pas imprimé lorsqu'une chaîne est imprimée avec
printf
. Fondamentalement, l'octet nul indique aux fonctions qui manipulent les chaînes quand s'arrêter.Là où vous verrez une différence, c'est si vous créez un
char
tableau initialisé avec une chaîne. L'utilisation de l'sizeof
opérateur reflétera la taille du tableau, y compris l'octet nul. Par exemple:la source
printf()
. TBH Je ne sais pas comment çaprintf()
marche.printf
renvoie le nombre de caractères imprimés.'\0'
n'est pas imprimé - il signale simplement qu'il n'y a plus de caractères dans cette chaîne. Il n'est pas non plus pris en compte dans la longueur de la chaînehttps://godbolt.org/z/wYn33e
la source
Votre hypothèse est fausse. Votre chaîne se termine en effet par un
\0
.Il contient 5 caractères
h
,e
,l
,l
,o
et le caractère 0.Ce que l'
print()
appel "intérieur" génère est le nombre de caractères imprimés, et c'est 5.la source
En C, toutes les chaînes littérales sont vraiment des tableaux de caractères, qui incluent le terminateur nul.
Cependant, le terminateur nul n'est pas compté dans la longueur d'une chaîne (littérale ou non) et il n'est pas imprimé. L'impression s'arrête lorsque le terminateur nul est trouvé.
la source
printf
sortirait des limites de la chaîne, et afficherait des caractères "aléatoires" ou "garbage", et retournerait un nombre différent de la longueur de la chaîne. Si vous connaissez déjà la longueur de la chaîne, vous pouvez également vérifier si le caractère de cet index est'\0'
, ce qui fonctionnera mais est un comportement techniquement indéfini si la taille du tableau n'inclut pas le terminateur (comme danschar arr[5] = "hello";
, qui n'ajoutera pas le terminateur au tableau).char * p = "Hello"; int i = 0; while (p[i] != '\0') { printf("%d: %c", i, p[i]); i++; }
et voir comment cela fonctionne: il montre les lignes avec des index et le contenu de cette ligne. Après l'index 4, il trouve le caractère 0 et rompt la boucle while. Là, vous voyez qu'il y a un caractère 0.Toutes les réponses sont vraiment bonnes mais j'aimerais ajouter un autre exemple pour compléter toutes ces
Pour ceux qui ne veulent pas essayer ceci sur gdb en ligne, le résultat est:
https://linux.die.net/man/3/printf
Est-ce utile pour comprendre ce que fait le terminateur d'échappement? Ce n'est pas une limite pour un tableau de caractères ou une chaîne. C'est le personnage qui dira au gars qui analyse -STOP, (print) analyse jusqu'à ici.
PS: Et si vous analysez et imprimez-le comme un tableau de caractères
vous obtenez:
où, le blanc après le double l, est le terminateur nul, cependant, en analysant un tableau de caractères, ne sera que la valeur de chaque octet. Si vous effectuez une autre analyse et imprimez la valeur int de chaque octet ("% d%, char_array [i]), vous verrez que (vous obtenez la représentation ASCII code-int) l'espace blanc a une valeur de 0.
la source
Dans la
C
fonctionprintf()
retourne le nombre de caractères imprimés,\0
est unnull
terminateur qui est utilisé pour indiquer la fin de la chaîne en langage c et il n'y a pas destring
type intégré à partir dec++
, cependant la taille de votre tableau doit être au moins supérieure au nombrechar
souhaité ranger.Voici la ref: cpp ref printf ()
la source
Vous avez tort. Cette instruction ne confirme pas que le littéral de chaîne
"hello"
ne se termine pas par le caractère zéro de fin'\0'
. Cette instruction a confirmé que la fonctionprintf
génère des éléments d'une chaîne jusqu'à ce que le caractère zéro de fin soit rencontré.Lorsque vous utilisez un littéral de chaîne comme dans l'instruction ci-dessus, le compilateur crée un tableau de caractères avec la durée de stockage statique qui contient des éléments du littéral de chaîne.
En fait, cette expression
est traité par le compilateur quelque chose comme ce qui suit
L'action de la fonction printf dans ce que vous pouvez imaginer de la manière suivante
Pour obtenir le nombre de caractères stockés dans la chaîne littérale "bonjour", vous pouvez exécuter le programme suivant
La sortie du programme est
la source
Vous devez d'abord effacer votre concept. Comme il sera effacé lorsque vous traitez avec un tableau, la commande d'impression que vous utilisez ne fait que compter les caractères placés entre parenthèses. Son nécessaire dans la chaîne de tableau qui se terminera par \ 0
la source
Une chaîne est un vecteur de caractères. Contient la séquence de caractères qui forment la chaîne, suivie de la chaîne de caractères de fin spéciale: '\ 0'
Exemple: char str [10] = {'H', 'e', 'l', 'l', 'o', '\ 0'};
Exemple: le vecteur de caractères suivant n'est pas une chaîne car il ne se termine pas par '\ 0'
char str [2] = {'h', 'e'};
la source