Existe-t-il des applications pratiques pour le format% n dans la famille printf / scanf?

StackOverflow https://stackoverflow.com/questions/353614

  •  20-08-2019
  •  | 
  •  

Question

int x;
printf("hello %n World\n", &x);
printf("%d\n", x);
Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top