Risposte:
Puoi evitarlo pubblicando un doppio '%' come questo: %%
Usando il tuo esempio:
printf("hello%%");
L'escape del segno '%' è solo per printf. Se fate:
char a[5];
strcpy(a, "%%");
printf("This is a's value: %s\n", a);
Stampa: This is a's value: %%
%
è specifico printf
, giusto?
\045
è la fuga in fase di compilazione che fa parte della lingua e si trasformerà in %
quando compilata. printf
è una funzione di runtime, quindi si occupa dei byte della stringa, non del codice sorgente C, e ha le sue sequenze di escape che fanno parte della funzione . In breve, printf
è una "lingua dentro una lingua" e printf("This is a's value: %s\n", a);
dà lo stesso risultato di printf("This is a's value: \045\0163\012", a);
.
printf("hello%c", '%');
. Tuttavia, %%
è meglio perché non utilizza un altro argomento.
Come altri hanno già detto, %% sfuggirà a%.
Si noti, tuttavia, che non si dovrebbe mai fare questo:
char c[100];
char *c2;
...
printf(c); /* OR */
printf(c2);
Ogni volta che devi stampare una stringa, sempre, sempre, stampala sempre usando
printf("%s", c)
per evitare che una% incorporata causi problemi [violazioni della memoria, segfault, ecc.]
Se non ci sono formati nella stringa, puoi usare puts
(o fputs
):
puts("hello%");
se esiste un formato nella stringa:
printf("%.2f%%", 53.2);
Come notato nei commenti, puts
aggiunge \n
a all'output e fputs
non lo fa.
puts
. Non ho mai pensato di puts
stampare le stringhe e sono passato subito printf
. Non più.
Con se stesso ...
printf("hello%%"); /* like this */
Nitpick:
non sfuggi davvero %
alla stringa che specifica il formato per la printf()
(e scanf()
) famiglia di funzioni.
La %
, nella printf()
(e scanf()
) famiglia di funzioni, inizia una specifica di conversione. Una delle regole per la specifica di conversione afferma che a %
come specificatore di conversione (immediatamente dopo quello %
che ha avviato la specifica di conversione) causa a'%'
scrittura di carattere senza la conversione dell'argomento.
La stringa contiene davvero 2 '%'
caratteri (al contrario dei caratteri di escape: "a\bc"
è una stringa con 3 caratteri non nulli; "a%%b"
è una stringa con 4 caratteri non nulli).
La barra rovesciata in C viene utilizzata per sfuggire ai caratteri nelle stringhe. Le stringhe non riconoscerebbero% come carattere speciale e quindi non sarebbe necessaria alcuna evasione. Printf è un'altra cosa: usa %% per stampare l'1%.
si utilizza identificatore di formato non corretta si dovrebbe usare %%
per la stampa %
. Il tuo codice dovrebbe essere:
printf("hello%%");
Per saperne di più tutti gli identificatori di formato utilizzati in C .
Puoi semplicemente usare %
due volte, cioè"%%"
Esempio:
printf("You gave me 12.3 %% of profit");
Il doppio '%' funziona anche in ".Format (…). Esempio (con iDrawApertureMask == 87, fCornerRadMask == 0.05):
csCurrentLine.Format("\%ADD%2d%C,%6.4f*\%",iDrawApertureMask,fCornerRadMask) ;
fornisce il valore desiderato e atteso di (contenuto stringa in) csCurrentLine;"% ADD87C, 0.0500 *% "