Pergunta

int x;
printf("hello %n World\n", &x);
printf("%d\n", x);
Foi útil?

Solução

Não é tão útil para printf(), mas pode ser muito útil para sscanf(), especialmente se você estiver analisando uma corda em múltiplas iterações. fscanf() e scanf() Avançar automaticamente seus ponteiros internos pela quantidade de leitura de entrada, mas sscanf() não. Por exemplo:

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

Outras dicas

Pode ser usado para executar más ações.

Depende do que você quer dizer com prático. Sempre existem outras maneiras de realizá -lo (imprima em um buffer de string com s [n] printf e calcule o comprimento, por exemplo).

No entanto

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

deve produzir

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

(embora não testado, não estou perto de um compilador C)

O que é praticamente prático como uma maneira de alinhar as coisas, mas eu não gostaria de vê -lo no código. Existem melhores maneiras de fazer isso.

É bastante esotérico. Se você precisar substituir um espaço reservado na sequência gerada posteriormente, poderá lembrar um índice no meio da string, para que você não precise salvar o parâmetro PrintF original ou analisar a sequência.

Pode ser usado como uma maneira rápida de obter o comprimento de várias substringas.

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

Estou perdendo algo aqui, com certeza. Os tomatos estão muito longe para a direita.

Aqui está algo do código VS2005 CRT:

/* 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;
}

O que traz à tona o seguinte:

TEXTO DE ALT HTTP://www.shiny.co.il/shooshx/printfn.png

Para a seguinte linha:

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

Acho que isso é principalmente para evitar o que @ejames está falando

você pode ligar

int _get_printf_count_output();

para ver se %n suporte é ativado ou usar

int _set_printf_count_output( int enable );

Para ativar ou desativar o suporte do formato %n.

de MSDN vs2008

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top