Existe-t-il des applications pratiques pour le format% n dans la famille printf / scanf?
Question
int x;
printf("hello %n World\n", &x);
printf("%d\n", x);
La solution
Ce n'est pas très utile pour printf()
, mais cela peut être très utile pour sscanf()
, en particulier si vous analysez une chaîne dans plusieurs itérations. fscanf()
et scanf()
avancent automatiquement leurs pointeurs internes de la quantité d’entrée lue, mais <=> ne le fait pas. Par exemple:
char stringToParse[256];
...
char *curPosInString = stringToParse; // start parsing at the beginning
int bytesRead;
while(needsParsing())
{
sscanf(curPosInString, "(format string)%n", ..., &bytesRead); // check the return value here
curPosInString += bytesRead; // Advance read pointer
...
}
Autres conseils
Il peut être utilisé pour effectuer des mauvaises actions .
Cela dépend de ce que vous entendez par pratique. Il y a toujours d'autres façons de le faire (imprimer dans un tampon de chaîne avec s [n] printf et calculer la longueur, par exemple).
Cependant
int len;
char *thing = "label of unknown length";
char *value = "value value value"
char *value2="second line of value";
printf ("%s other stuff: %n", thing, &len);
printf ("%s\n%*s, value, len, value2);
devrait produire
label of unknown length other stuff: value value value
second line of value
(bien que non testé, je ne suis pas près d'un compilateur C)
Ce qui est à peu près pratique pour aligner les choses, mais je ne voudrais pas le voir dans le code. Il y a de meilleures façons de le faire.
C'est assez ésotérique. Si vous devez remplacer ultérieurement un espace réservé dans la chaîne générée, vous voudrez peut-être mémoriser un index au milieu de la chaîne, de sorte que vous n'ayez pas à enregistrer le paramètre printf d'origine ni à analyser la chaîne.
Il pourrait éventuellement être utilisé comme un moyen rapide d'obtenir les longueurs de différentes sous-chaînes.
#include <stdio.h>
int main(int argc, char* argv[])
{
int col10 = (10 - 1);
int col25 = (25 - 1);
int pos1 = 0;
int pos2 = 0;
printf(" 5 10 15 20 25 30\n");
printf("%s%n%*s%n%*s\n", "fried",
&pos1, col10 - pos1, "green",
&pos2, col25 - pos2, "tomatos");
printf(" ^ ^ ^ ^ ^ ^\n");
printf("%d %d\n", pos1, pos2);
printf("%d %d\n", col10 - pos1, col25 - pos2);
return 0;
}
Je manque quelque chose ici à coup sûr. Les tomates sont trop loin à droite.
Voici quelque chose du code de tube cathodique VS2005:
/* if %n is disabled, we skip an arg and print 'n' */
if ( !_get_printf_count_output() )
{
_VALIDATE_RETURN(("'n' format specifier disabled", 0), EINVAL, -1);
break;
}
qui fait apparaître ceci:
texte de remplacement http://www.shiny.co.il/shooshx/printfn .png
pour la ligne suivante:
printf ("%s other stuff: %n", thing, &len);
Je suppose que c'est principalement pour éviter ce dont parle @eJames
vous pouvez appeler
int _get_printf_count_output();
pour voir si le support% n est activé ou utilisez
int _set_printf_count_output( int enable );
Activer ou désactiver la prise en charge du format% n.
à partir de MSDN VS2008