Como escapar do sinal de% (por cento) no printf de C?

274

Como você escapa do sinal% ao usar printfem C?

printf("hello\%"); /* not like this */
Chris_45
fonte

Respostas:

421

Você pode escapar postando um '%' duplo assim: %%

Usando seu exemplo:

printf("hello%%");

O sinal de escape '%' é apenas para printf. Se você fizer:

char a[5];
strcpy(a, "%%");
printf("This is a's value: %s\n", a);

Irá imprimir: This is a's value: %%

Pablo Santa Cruz
fonte
8
"printf (" olá %% ");" está certo. Mas não é uma fuga, eu acho. use printf ("olá \ 045");
Lai Jiangshan 11/12/2009
1
@ Pablo Santa Cruz: esse método para "escapar" %é específico printf, correto?
Lazer
10
Este é um caso especial da regra muito comum em sistemas de escape que, para obter um símbolo de escape literal, você usa <escape symbol> <escape symbol>.
dmckee --- gatinho ex-moderador
12
Lai Jiangshan, isso não vai funcionar. \045é um escape em tempo de compilação que faz parte do idioma e se transformará %quando compilado. printfé uma função de tempo de execução, portanto, lida com bytes da sua string, não com o código-fonte C e possui suas próprias seqüências de escape que fazem parte da função . Em resumo, printfé um "idioma dentro de um idioma" e printf("This is a's value: %s\n", a);dá o mesmo resultado que printf("This is a's value: \045\0163\012", a);.
Triang3l
5
Além disso, você pode fazer isso: printf("hello%c", '%');. No entanto, %%é melhor porque não usa outro argumento.
Triang3l
36

Como já foi dito, %% escapará do%.

Observe, no entanto, que você nunca deve fazer isso:

char c[100];
char *c2;
...
printf(c); /* OR */
printf(c2);

Sempre que você precisar imprimir uma sequência, sempre, sempre, sempre a imprima usando

printf("%s", c)

para impedir que um% incorporado cause problemas [violações de memória, segfault, etc.]

Mikeage
fonte
O aviso é geralmente apropriado, no entanto, pode haver situações nas quais você queira fazer "isso" - desde que você saiba que a string que você fornecer será interpretada como uma string de formato.
PP.
2
Eu vim com uma solução alternativa uma vez - copie o buffer para outro buffer e depois passe por ele dobrando os sinais de%. Acabei encontrando essa idéia e substituí uma função de 20 a 30 linhas por uma. Não se preocupe, eu me bati severamente na cabeça, como eu merecia.
Graeme Perrow
É verdade, mas não esqueça que 99% das vezes em que você obtém uma string de formato, obtém os argumentos como uma va_list, portanto, você precisa usar o vprintf. Assim, estou tecnicamente correta;)
Mikeage
2
É muito mais fácil fazer put (c). If
William Pursell
1
coloca anexa uma nova linha. Isso geralmente é um comportamento indesejado.
Mikeage 8/12/2009
33

Se não houver formatos na cadeia, você pode usar puts(ou fputs):

puts("hello%");

se houver um formato na sequência:

printf("%.2f%%", 53.2);

Conforme observado nos comentários, putsanexa \na à saída e fputsnão.

Sinan Ünür
fonte
4
Vale mencionar também fputs (), uma vez que ele retribui diretamente para fprintf ().
Tim Post
1
O put também adiciona uma nova linha [mesmo que você já tenha uma]. Se você quer isso, ótimo. Caso contrário ...
Mikeage 08/12/2009
@ Sinan Ünür: obrigado por me lembrar puts. Eu nunca pensei putsem imprimir cordas e pulei direto para printf. Não mais.
Lazer
10

Com ele mesmo ...

printf("hello%%"); /* like this */
Martin Clayton
fonte
7

Nitpick:
Você realmente não escapa da %string que especifica o formato para a família de funções printf()(e scanf()).

O %, na printf()(e scanf()) família de funções, inicia uma especificação de conversão. Uma das regras para a especificação de conversão afirma que um %como especificador de conversão (imediatamente após o %que iniciou a especificação de conversão) faz com que um '%'caractere seja gravado sem nenhum argumento convertido.

A string realmente possui 2 '%'caracteres (em oposição a caracteres de escape: "a\bc"é uma string com 3 caracteres não nulos; "a%%b"é uma string com 4 caracteres não nulos).

pmg
fonte
2
tecnicamente, ainda está "escapando"; personagens que são necessidade especial uma forma de "escape" seu significado especial e estar de volta à sua "natureza caráter"
ShinTakezou
6

use um %% duplo

jldupont
fonte
4

Como isso:

printf("hello%%");
//-----------^^ inside printf, use two percent signs together
Salman A
fonte
3

A barra invertida em C é usada para escapar caracteres em seqüências de caracteres. Strings não reconheceriam% como um caractere especial e, portanto, nenhuma fuga seria necessária. Printf é outra questão: use %% para imprimir um%.

Ralph M. Rickenbach
fonte
3

Você pode usar %%:

printf("100%%");

O resultado é:

100%

Pato Donald
fonte
2

Sim, use printf ("olá %%"); e está feito.

Kevin
fonte
2

Você pode simplesmente usar %duas vezes, ou seja,"%%"

Exemplo:

printf("You gave me 12.3 %% of profit");
Md Shahriar
fonte
1

O duplo '%' funciona também em ".Format (…). Exemplo (com iDrawApertureMask == 87, fCornerRadMask == 0,05): csCurrentLine.Format("\%ADD%2d%C,%6.4f*\%",iDrawApertureMask,fCornerRadMask) ; fornece o valor desejado e esperado de (conteúdo da string em) csCurrentLine;"% ADD87C, 0,0500 *% "

dindea
fonte