Come sfuggire al segno% (percentuale) in C's printf?


274

Come si evita il segno% quando si utilizza printfin C?

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

Risposte:


421

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: %%


8
"printf (" ciao %% ");" è giusto. Ma non è una fuga credo. usa printf ("ciao \ 045");
Lai Jiangshan,

1
@Pablo Santa Cruz: questo metodo per "scappare" %è specifico printf, giusto?
Lazer,

10
Questo è un caso speciale della regola molto comune nei sistemi di escape che per ottenere un simbolo di fuga letterale usi <simbolo di fuga> <simbolo di fuga>.
dmckee --- ex-moderatore gattino

12
Lai Jiangshan, questo non funzionerà. \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);.
Triang3l

5
Inoltre, si può fare questo: printf("hello%c", '%');. Tuttavia, %%è meglio perché non utilizza un altro argomento.
Triang3l

36

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


L'avvertimento è generalmente appropriato, tuttavia potrebbero esserci situazioni in cui si desidera fare "questo" - purché si sappia che la stringa fornita verrà interpretata come una stringa di formato.
PP.

2
Una volta ho trovato una soluzione alternativa: copiare il buffer in un altro buffer e quindi analizzarlo raddoppiando i segni%. Alla fine mi sono imbattuto in questa idea e ho sostituito una funzione di 20-30 linee con una riga. Non preoccuparti, mi sono picchiato gravemente sulla testa, come meritavo.
Graeme Perrow,

È vero, ma non dimenticare che il 99% delle volte quando ricevi una stringa di formato, ottieni gli argomenti come va_list, quindi devi usare vprintf. Quindi, sono tecnicamente corretto;)
Mikeage

2
È molto più facile fare put (c). Se
William Pursell il

1
mette una riga nuova. Questo è spesso un comportamento indesiderato.
Mikeage,

33

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, putsaggiunge \na all'output e fputsnon lo fa.


4
Vale la pena menzionare anche fputs (), poiché ricambia direttamente con fprintf ().
Tim Post

1
mette inoltre una nuova riga [anche se ne hai già una]. Se lo vuoi, fantastico. Altrimenti ...
Mikeage l'

@Sinan Ünür: grazie per avermelo ricordato puts. Non ho mai pensato di putsstampare le stringhe e sono passato subito printf. Non più.
Lazer,


7

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


2
tecnicamente, è ancora "in fuga"; i personaggi speciali hanno bisogno di un modo per "sfuggire" al loro significato speciale e tornare alla loro "natura di carattere"
ShinTakezou,


4

Come questo:

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

3

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


3

Puoi usare %%:

printf("100%%");

Il risultato è:

100%



2

Sì, usa printf ("ciao %%"); ed è fatto.


2

Puoi semplicemente usare % due volte, cioè"%%"

Esempio:

printf("You gave me 12.3 %% of profit");

1

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 *% "

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.