Ich habe eine kleine Frage. Ich weiß, dass der Formatbezeichner% x verwendet werden kann, um Werte aus dem Stapel in einem Formatzeichenfolgenangriff zu lesen.
Ich habe folgenden Code gefunden:
%08x%08x%08x%08x
Was bedeutet die 08? Was macht es genau? Vielen Dank :)
000007ac
oder0005ceef
.printf()
dass sie verwendet werden.Antworten:
Nervenzusammenbruch:
8
sagt, dass Sie 8 Ziffern anzeigen möchten0
dass Sie0
's anstelle von nur Leerzeichen voranstellen möchtenx
dass Sie in hexadezimaler Kleinbuchstabe drucken möchten.Schnelles Beispiel (danke an Grijesh Chauhan):
#include <stdio.h> int main() { int data = 29; printf("%x\n", data); // just print data printf("%0x\n", data); // just print data ('0' on its own has no effect) printf("%8x\n", data); // print in 8 width and pad with blank spaces printf("%08x\n", data); // print in 8 width and pad with 0's return 0; }
Ausgabe:
1d 1d 1d 0000001d
Siehe auch http://www.cplusplus.com/reference/cstdio/printf/ als Referenz.
quelle
%-8x
und Kapital versuchenX
. und beobachten Sie die Wirkung8
und0
beide Zahlen (und damit identische Teile einer Grammatik in der englischen Sprache) sind, sind sie verschiedene Teile der Grammatik im Printf-Format.0
ist ein "Flag" und8
ist ein Parameter für "width" (was sein kann<ε (no input)>
,<d (any number greater than 0)>
oder* (a literal asterisk)
). Es ist sicher eine nicht intuitive API! Aber was können Sie sagen ... das ist alles altmodisches C-Zeug, bei dem der Speicher so hoch war, dass Sie so viele Zeichen wie möglich in einem Programm speichern möchten - ich stimme ihrer Entscheidung angesichts der Einschränkungen zu, mit denen sie konfrontiert waren!printf
Syntax neu gestalten ? Ich liebe es,%
als Escape-Charakter zu verwenden, es ist so einzigartig und eine Nische für die Formatierung von Strings. Ich denke, Modifikatoren sollten jedoch angehängt und nicht vorangestellt werden - auf diese Weise können Sie sie von links nach rechts lesen. So etwas wie%<specifier>[%f<flags>][%-w<width>.<precision>]%
statt%[flags][width][.precision][length]specifier
. Ich habe%
zwischen jedem Feld ein Feld sowie eines zum Schließen ausgewählt (so dass Sie immer noch tun können%x%x
- `% x %% x%) und erlaubt einen Multi-Char-Bezeichner%08x
bedeutet, dass jede Zahl mindestens 8 Zeichen breit gedruckt werden sollte, wobei alle fehlenden Ziffern mit Nullen gefüllt werden, z. B. für '1'00000001
quelle
Das gibt an, wie viele Ziffern angezeigt werden sollen.
quelle
Von http://en.wikipedia.org/wiki/Printf_format_string
Verwenden Sie 0 anstelle von Leerzeichen, um ein Feld aufzufüllen, wenn die Option width angegeben ist. Beispielsweise
printf("%2d", 3)
ergibt sich "3", währendprintf("%02d", 3)
sich "03" ergibt.quelle
Der von Ihnen erwähnte Formatstring-Angriff auf printf ist nicht spezifisch für die Formatierung "% x". In jedem Fall liest printf mehr Formatierungsparameter als übergebene Variablen und liest Werte aus dem Stapel, die nicht dazu gehören. Sie erhalten das gleiche Problem beispielsweise mit% d. % x ist nützlich, wenn Sie diese Werte als hexadezimal anzeigen möchten.
Wie in den vorherigen Antworten erläutert, erzeugt% 08x eine 8-stellige Hex-Zahl, die durch vorhergehende Nullen aufgefüllt wird.
Verwenden der Formatierung in Ihrem Codebeispiel in printf ohne zusätzliche Parameter:
printf ("%08x %08x %08x %08x");
Ruft 4 Parameter vom Stapel ab und zeigt sie als 8-stellige gepolsterte Hex-Zahlen an.
quelle