Esistono applicazioni pratiche per il formato% n nella famiglia printf / scanf?

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

  •  20-08-2019
  •  | 
  •  

Domanda

int x;
printf("hello %n World\n", &x);
printf("%d\n", x);
È stato utile?

Soluzione

Non è così utile per printf(), ma può essere molto utile per sscanf(), specialmente se stai analizzando una stringa in più iterazioni. fscanf() e scanf() avanzano automaticamente i loro puntatori interni della quantità di input letto, ma <=> no. Ad esempio:

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
    ...
}

Altri suggerimenti

Può essere utilizzato per eseguire atti malvagi .

Dipende da cosa intendi per pratico. Esistono sempre altri modi per realizzarlo (stampare in un buffer di stringhe con s [n] printf e calcolare la lunghezza, per esempio).

Tuttavia

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);

dovrebbe produrre

label of unknown length other stuff: value value value
                                     second line of value

(anche se non testato, non sono vicino a un compilatore C)

Che è praticamente pratico come un modo per allineare le cose, ma non vorrei vederlo nel codice. Esistono modi migliori per farlo.

È abbastanza esoterico. Se devi sostituire un segnaposto nella stringa generata in un secondo momento, potresti voler ricordare un indice nel mezzo della stringa, in modo da non dover salvare il parametro printf originale o analizzare la stringa.

Potrebbe forse essere usato come un modo rapido per ottenere le lunghezze di varie sottostringhe.

#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;
}

Mi manca qualcosa qui di sicuro. I pomodori sono troppo a destra.

Ecco qualcosa dal codice CRT 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;
}

che fa apparire questo:

alt text http://www.shiny.co.il/shooshx/printfn .png

per la seguente riga:

    printf ("%s other stuff: %n", thing, &len);

Suppongo che ciò sia principalmente per evitare di cosa parla @eJames

puoi chiamare

int _get_printf_count_output();

per vedere se il supporto% n è abilitato o usa

int _set_printf_count_output( int enable );

per abilitare o disabilitare il supporto del formato% n.

da MSDN VS2008

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top