2013-08-05 10 views
6

Ich bin ein wenig verwirrt darüber, wie printf ASCII-Zeichen behandelt.printf die ASCII-Zeichen% gibt manchmal c und nicht%

Wenn ich das Zeichen% so drucke, bekomme ich eine korrekte Antwort wie "ascii%", und das ist in Ordnung.

printf("ascii %% \n"); 
printf("ascii \x25 \n"); 
printf("ascii %c \n", 0x25); 

ascii % 

Und ich kann sie auf der gleichen Zeile wie diese setzen, und ich erhalte „ascii%%“, und das ist auch in Ordnung.

printf("ascii %c \x25 \n", 0x25); 

ascii % % 

Aber ich kann das seither in der anderen Reihenfolge nicht bekomme ich c und nicht%, wie diese "ascii% c"

printf("ascii \x25 %c \n", 0x25); 

ascii %c 

Was geschieht?

Allerdings habe ich festgestellt, dass es scheint printf behandelt \ x25 wie das normale% -Zeichen, da, wenn ich ein weiteres% direkt nach der Ausgabe hinzufügen (\ x25%) wird es was ich erwarte.

printf("ascii \x25% %c \n", 0x25); 

ascii % % 

Aber dann habe ich auch bemerkt, dass ein einzelnes% Druck auch zu funktionieren scheint, aber ich habe es nicht erwartet zu.

printf("ascii % \n"); 

ascii % 

Warum diese Arbeit habe, dachte ich, dass ein einzelnes% keine gültige Eingabe in printf war ... Könnte jemand klären, wie printf funktionieren soll?


Hinweis: Ich benutze die Standard-GCC auf Ubuntu 12.04 (gcc Version 4.6.3).

+0

Große Frage! Erhalten Sie keine Warnung für "ascii% \ n" '? –

+0

"\ x25% c" gibt "Warnung: Konvertierung fehlt Typ am Ende des Formats [-W Format"], aber das bezieht sich auf den Platz seit "\ x25% c" kompiliert ohne Warnung. – Johan

+0

Nein. Es ist nicht im Zusammenhang mit dem Raum, zumindest nicht direkt. Wenn 'printf' das erste'% 'sieht, beginnt es tatsächlich, die Formatierungssequenz zu interpretieren. Der Platz kann innerhalb einer Formatierungssequenz für Zahlen oder Zeichenfolgen gültig sein, sodass der Platz akzeptiert wird. Aber dann wird kein weiteres Formatzeichen gefunden (d, x, s, ...), das die Warnung anzeigt. Auf der anderen Seite, wenn kein Leerzeichen vorhanden ist, besteht die Formatierungssequenz einfach aus zwei aufeinanderfolgenden Prozent und ist somit gültig. –

Antwort

7

In C strings Syntax \ das Escape-Zeichen beginnt eine Escape-Sequenz, die der Compiler verwendet die tatsächliche Zeichenfolge zu erzeugen, was in die endgültigen binären aufgenommen werden. Daher werden innerhalb von C-Quellcode "%" und "\ x25" genau die gleichen Zeichenketten in der endgültigen Binärdatei erzeugen.

die einzigen % In Bezug auf, ist dies ein fehlerhaftes Format-String. Dies führt zu undefiniertem Verhalten. Deshalb

printf("ascii \x25 %c \n", 0x25); 

ist actualy genau das gleiche wie

printf("ascii % %c \n", 0x25); 

Es in undefinierten Verhalten führt. Es gibt nichts mehr zu tun, zu verstehen, was mit einzelnen Prozentzeichen passiert, ist Zeitverschwendung.

2

Ja, printf behandelt \ x25 wie das normale% -Zeichen, printf("ascii % \n"); funktioniert, weil % am Ende der Formatzeichenfolge steht (whitespace wird ignoriert).

+1

FALSCH: 'printf' sieht nie das' \ x25'. –

+0

Also ist es der Preloader, der \ x25 in% konvertiert, so dass printf die gleiche Eingabe zur Laufzeit erhält? – Johan

+0

@Johan Nein, es ist nicht der Preloader. Es ist der Compiler, der das gleiche Zeichenarray in der ausführbaren Datei generiert. –

1

das Format printf("ascii \x25 %c \n", 0x25);, da, wie Sie vermuten, \ x25 ist genau das gleiche wie ein '%' Zeichen, ist {Prozent} {Leerzeichen} {Prozent} {c}. Also, es druckt ein Prozentzeichen mit einem führenden Leerzeichen, dann ein 'c'.

[edit: es gibt keinen führenden Raum wie gesagt, da ‚c‘ nicht ein numerischer Bezeichner ist] [Bearbeiten 2: das Argument“, 0x25" werden ignoriert, da es keine passenden Spezifizierer ist, es zu benutzen]

+0

Eigentlich scheint er diesen Raum in der Mitte zu ignorieren, also wird er {prozent} {prozent} {c}, und dann ist es ziemlich klar, was daraus werden wird. – Johan

+0

ja, das habe ich in meinem ersten Schnitt versucht zu vermitteln, erfolglos scheint es:^\ –

Verwandte Themen