char str[] = "some text"; printf ("%.*s", strlen(str), str);
** Bien sûr, leurs tampons, des chaînes encore être bien cibléesCette forme d'utilisation de printf api le rend plus sûr?
char str[] = "some text"; printf ("%.*s", strlen(str), str);
** Bien sûr, leurs tampons, des chaînes encore être bien cibléesCette forme d'utilisation de printf api le rend plus sûr?
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
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.
printf n'essaie pas de détecter la fin du tampon. –
@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. –
@Roger Pate: Désolé .. pensait sprintf :) –
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
.
Non, c'est pas différent de:
char str[] = "some text";
printf("%s", str);
Quelle attaque que vous essayez d'éviter? – Amnon