Respostas:
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: %%
%
é específico printf
, correto?
\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);
.
printf("hello%c", '%');
. No entanto, %%
é melhor porque não usa outro argumento.
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.]
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, puts
anexa \n
a à saída e fputs
não.
puts
. Eu nunca pensei puts
em imprimir cordas e pulei direto para printf
. Não mais.
Com ele mesmo ...
printf("hello%%"); /* like this */
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).
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%.
Você pode usar %%:
printf("100%%");
O resultado é:
100%
você está usando um especificador de formato incorreto %%
para impressão %
. Seu código deve ser:
printf("hello%%");
Leia mais todos os especificadores de formato usadas em C .
Você pode simplesmente usar %
duas vezes, ou seja,"%%"
Exemplo:
printf("You gave me 12.3 %% of profit");
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 *% "