136 votes

Qu'est-ce que l'utilisation de l' %n spécificateur de format en C?

Qu'est-ce que l'utilisation de l' %n spécificateur de format en C? Quelqu'un pourrait-il expliquer avec un exemple?

201voto

jamesdlin Points 13455

La plupart de ces réponses expliquer ce qu' %n t (qui est à l'impression de rien et d'écrire le nombre de caractères imprimés jusqu'à présent à un int variable), mais jusqu'à présent, personne n'a vraiment donné un exemple de ce que l'utilisation qu'il possède. En voici une:

int n;
printf("%s: %nFoo\n", "hello", &n);
printf("%*sBar\n", n, "");

affichera:

hello: Foo
       Bar

avec Foo et Bar alignés. (Il est trivial de le faire sans l'aide d' %n pour cet exemple particulier, et en général on a toujours pu briser cette première printf appel:

int n = printf("%s: ", "hello");
printf("Foo\n");
printf("%*sBar\n", n, "");

Si le légèrement plus de confort vaut utiliser quelque chose d'ésotérique comme %n (et éventuellement d'introduire des erreurs) est ouvert au débat.)

155voto

Starkey Points 7030

Rien imprimé. L'argument doit être un pointeur sur un signed int, où le nombre de caractères écrits à ce jour est stockée.

#include <stdio.h>

int main()
{
 int val;

 printf("bla %n bla\n", &val);

 printf("val = %d\n", val);

 return 0;

}

Le code précédent impressions:

bla bla
val = 5

19voto

Xzhsh Points 1103

Je n'ai pas vraiment vu beaucoup de pratique du monde réel utilise de l' %n spécificateur, mais je me souviens qu'il a été utilisé dans oldschool printf vulnérabilités avec une chaîne de format d'attaque tout à fait un tout à l'arrière.

Quelque chose qui ressemblait à ceci

void authorizeUser( char * username, char * password){

    ...code here setting authorized to false...
    printf(username);

    if ( authorized ) {
         giveControl(username);
    }
}

lorsqu'un utilisateur malveillant pourrait profiter de l'identifiant de paramètre passé dans printf, comme la chaîne de format et utiliser une combinaison de %d, %c ou w/e pour passer à travers la pile d'appel et ensuite modifier la variable autorisé à une valeur vraie.

Oui, c'est une utilisation ésotérique, mais toujours utiles à connaître lors de l'écriture d'un démon pour éviter les failles de sécurité? :D

14voto

KLee1 Points 3238

À partir d' ici , nous voyons qu'il stocke le nombre de caractères imprimés jusqu'à présent.

n L'argument est un pointeur vers un entier, dans lequel est écrit le nombre d'octets écrits à la sortie jusqu'à présent par le présent appel à un de la fprintf() fonctions. Aucun argument n'est converti.

Un exemple d'utilisation serait:

int n_chars = 0;
printf("Hello, World%n", &n_chars);

n_chars aurait alors une valeur de 12.

11voto

Evan Huddleston Points 578

L'argument associé avec le %de n sera traité comme un int* et rempli avec le nombre total de caractères imprimés à ce point dans le printf.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X