2013-07-23 15 views
17

La documentazione printf() dice che se qualcuno vuole stampare % in C, si può utilizzare:Perché il carattere percentuale non è sfuggito con la barra rovesciata in C?

printf("%%") 

Perché non è:

printf("\%") 

come con altri caratteri speciali?

+1

Controlla questo link per ulteriori informazioni; http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.cmds/doc/aixcmds4/printf.htm – JNL

+1

Questo è solo il modo di printf. Preferisco usare questo riferimento http://www.cplusplus.com/reference/cstdio/printf/ – GreenScape

risposta

28

Perché il % viene gestito da printf. Non è un carattere speciale in C, ma lo stesso printf lo tratta in modo diverso.

35

Il backslash viene elaborato dal compilatore quando si interpreta il testo sorgente del programma. Quindi il risultato comune è che il testo sorgente "\%" produce una stringa contenente "%".

La stringa di formato viene interpretata dalla routine printf, quindi elabora i caratteri passati ad essa. A questo punto, il backslash non è più presente, quindi printf non lo vede mai.

Tecnicamente, \% non è legale in una stringa letterale. Il carattere \ inizia una sequenza di escape, e le uniche sequenze di escape giuridiche nella C 2011 6.4.4.4 1. Sono \ seguito da ', ", ?, \, a, b, f, n, r, t, v , da una a tre cifre ottali, x e cifre esadecimali, u e quattro cifre esadecimali o U e otto cifre esadecimali.

Se printf era stato progettato in modo che una barra rovesciata sarebbe sfuggito un per cento, allora si dovrà passare un backslash di escape del backslash nel testo di partenza, in modo che avrebbe dovuto scrivere:

printf("\\%"); 
+1

+1 per l'attenta formulazione di "x e cifre esadecimali" http: // StackOverflow.it/questions/5784969/when-did-c-compilers-start-considerando-more-than-two-hex-digits-in-string-lite – chux

3

La convenzione è che i personaggi speciali si salvano da soli. Quindi, piuttosto che usare il backslash per sfuggire alla percentuale, esso sfugge a se stesso. (Si noti che per passare una barra rovesciata a printf, si dovrebbe scrivere la stringa letterale come "\\%".)

+0

La convenzione utilizzata con '\' dal compilatore e '%' da printf è che quei personaggi si sfuggono da soli. La convenzione all'interno di stringhe letterali e caratteri è che il backslash è usato per sfuggire ai delimitatori finali. Personalmente, sono convinto che sia meglio avere la rappresentazione di escape di un personaggio di escape sia quel carattere seguito da un particolare * qualcos'altro *; ed evitare di avere delle fughe simili ad altre cose, ma l'idea di raddoppiare i caratteri di escape e le cose precedenti come le virgolette con escapes (piuttosto che usare ad esempio '\ q' come una citazione di escape) sembra abbastanza comune. – supercat

+0

Anche nei letterali stringa e caratteri vale anche la barra rovesciata, il metacarattere e la sua fuga; i caratteri di citazione non si sfuggono nella maggior parte delle lingue, invece viene utilizzato il backslash. Penso che tu sia d'accordo con me? Ci sono alcuni schemi bizzarri in cui le virgolette doppie vengono usate per rappresentare le virgolette letterali (in questo caso viene in mente UTR35, ed è un vero incubo). –

+0

I metacaratteri raddoppiati per rappresentare se stessi sono un modello comune, anche se non conosco alcun vantaggio reale oltre alla popolarità, dal momento che significa che non si può sapere cosa significa un determinato personaggio senza poter vedere un numero arbitrario di caratteri prima esso. Avere la rappresentazione di escape per '\' be '\!' Eviterebbe l'ambiguità su cosa una stringa che sembra terminare con '\\\\\\\" significa che [la citazione è una parte di escape della stringa o no? ] Altre lingue usano approcci diversi, anche se a volte generano ambiguità proprie (es. Stringhe di formato .NET). – supercat

0

Si può fare !!!!!

#include <iostream> 
#include <string> 
#include "stdio.h" 
using namespace std; 



int main(int argc, char **argv) 
{ 


    printf("hhhhhhh %s \n","\%"); 
    printf("hhhhhhh \n"); 

    return 0; 
} 

Il problema esiste con printf e differiscono dal compilatore si utilizza .. Con wxWidget lib non è possibile utilizzare printf con due sequenze di escape

printf(" xxxxxx \0x81 xx \0x82 xx \n"); 

don t andare. Ma se si utilizza

printf(" xxxxxx %s xx %s \n","\0x81","\0x82"); 

hai ragione. A plus

Problemi correlati