2009-11-24 8 views

Répondre

1

Non, printf devrait être dépassement de forme sûre de réglage de toute façon une largeur de champ ne contribue pas vraiment

3

Non, ce seulement des changements le problème de détecter la fin de la chaîne de printf à strlen, et c'est toujours exactement la même chose.

+0

printf n'essaie pas de détecter la fin du tampon. –

+0

@Billy: printf tente de détecter la fin de la chaîne (la valeur logique, pas la fin de la mémoire tampon) en recherchant un caractère nul. –

+0

@Roger Pate: Désolé .. pensait sprintf :) –

1

Dans l'exemple que vous donnez, il n'y a pas de différence. printf interprète le code de caractère "% s" non décoré comme signifiant "lire et imprimer tous les caractères d'un pointeur de caractère jusqu'à ce qu'un caractère nul soit rencontré". L'initialiseur char str[] = "some text"; ajoute automatiquement le caractère nul, il n'y aura donc pas de dépassement. D'autre part, ce qui suit est pas sûr

char str[] = {'h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd'}; 
printf("%s", str); 

, car aucun caractère nul est ajouté à la séquence de caractères str. D'autre part, puisque strlen(str) détermine la longueur de la chaîne en comptant le nombre de caractères avant qu'une valeur nulle ne soit rencontrée, elle ne vous offre aucun avantage par rapport à l'utilisation de printf sans spécifier de largeur de champ. Le résultat: le seul cas où la spécification d'une largeur de champ pour une chaîne est utile est lorsque la chaîne n'est pas censée être terminée par un caractère nul (ou le cas classique d'utilisation de sprintf pour écrire dans un tampon qui peut ne pas être assez grand pour contenir le contenu de str), mais dans ce cas, vous devez déterminer la longueur de la chaîne en utilisant autre chose que strlen.

0

Non, c'est pas différent de:

char str[] = "some text"; 
printf("%s", str);