====== Platzhalter für String-Funktionen ====== Die folgende Tabelle zeigt die Platzhalter, die für String-Ein-/Ausgabe-Funktionen der Standard-C-Library. Viele andere Funktionen bauen mit Hilfe der [[c:lib:stdarg:start]]-Library auf den Standardfunktionen auf, die Tabelle gilt also auch für viele andere Funktionen. ===== Platzhaltertypen ===== ^ Integers ^^^ ^ Sonderzeichen ^ Bedeutung ^ Beispiele ^ | %d | Integer (32 Bit, mit Vorzeichen) | 31; -31 | | %i | Integer (32 Bit, mit Vorzeichen) | 31; -31 | | %u | Integer (32 Bit, positiv, ohne Vorzeichen) | 31 | | %x | integer in hexadezimaler Schreibweise (hex, kein Standard!), kleine Buchstaben | 1f | | %X | integer in hexadezimaler Schreibweise (hex, kein Standard!) | 1F | | %o | Integer in oktaler Schreibweise | 37 | | %p | Pointer | | ^ Fließkommazahlen ^^^ ^ Sonderzeichen ^ Bedeutung ^ Beispiele ^ | %f | Fließkommazahl | 47.11 | | %e | Fließkommazahl in Exponentialdarstellung (kleines e) | 4.711e+1 | | %E | Fließkommazahl in Exponentialdarstellung (großes E) | 4.711E+1 | ^ Buchstaben und Strings ^^^ ^ Sonderzeichen ^ Bedeutung ^ Beispiele ^ | %c | Wert als ASCII-Zeichen (character) | a | | %s | Adresse als Zeichenkette (String) | Hallo proggen.org | ^ Sonstiges ^^^ ^ Sonderzeichen ^ Bedeutung ^ Beispiele ^ | %n | Bisher gedruckte Zeichen auf einen Pointer (auf ein signed int) schreiben | | | %% | Druckt ein (nur ein!) Prozentzeichen | % | ===== Formatierung ===== Diese Platzhalter können auch nach folgendem Muster formatiert werden: %[Flags][Feldbreite][.][Genauigkeit][Eingabetyp]Platzhaltertyp Bis auf den Platzhaltertyp sind alle Angaben optional. ==== Flags ==== ^ Zeichen ^ Bedeutung ^ Beispiele ^ | - | linksbündig in der Feldbreite | "4711 " | | + | Erzwingt ein Vorzeichen auch bei positiven Zahlen | " +4711" | | -Leerzeichen- | Die Feldbreite wird mit Leerzeichen vor der Zahl aufgefüllt | " 4711" | | # | Erzwingt eine Beschreibung der Zahlenbasis (0 für Oktal, 0x/0X für Hexadezimal ) \\ bei Fließkommazahlen (E, e) folgt ein Punkt, auch wenn keine Nachkommastellen gedruckt werden, bei G und g werden die nachfolgenden Nullen nicht entfernt | "0123", "0xbadc0de", "4711." | | 0 | Die Feldbreite wird mit Nullen vor der Zahl aufgefüllt | "00004711" | ==== Feldbreite ==== Wird eine Zahl angegeben, so wird für diesen Platzhalter mindestens diese Breite reserviert. Passt der einzufügende Inhalt nicht in den Platzhalter, so wird mehr Platz verwendet - es wird nicht abgeschnitten. Ist der einzufügende Inhalt kürzer, so wird der Platz entsprechend der Flags aufgefüllt (per Voreinstellung mit Leerzeichen). Wird ein * angegeben, so folgt ein zusätzliches Integer-Argument in der Parameterliste, der die Feldbreite angibt und zwar **vor** dem Argument, das ausgegeben wird. Beispiel: printf( "[%*s]\n", 10, "Hallo" ); printf( "[%-*s]\n", 10, "Hallo" ); Ausgabe: [ Hallo] [Hallo ] ==== Genauigkeit ==== Die Genauigkeit gibt an, wie ab wann eine Ausgabe gekürzt wird. Dies ist abhängig von Platzhaltertyp. ^ Platzhaltertyp ^ Beschreibung ^ Beispiel ^ Eingabe ^ Ausgabe ^ | Integer | Gibt die minimale Zahl zu schreibender Ziffern an, fehlende Ziffern werden vorangestellte Nullen aufgefüllt. Längere Integerzahlen werden nicht gekürzt. Wird 0 angegeben, so wird der Wert 0 nicht gedruckt. | %.10d | 10 | "0000000010" | | f | Anzahl der zu druckenden Ziffern nach dem Dezimalpunkt | %.3f | 10.1234567 | "10.123" | | e, E | Anzahl der zu druckenden Ziffern nach dem Dezimalpunkt | %.3e | 10.1234567 | "1.012e+01" | | g, G | Anzahl der zu druckenden Ziffern | %.5g | 10.1234567 | "10.123" | | s | Anzahl der zu druckenden Zeichen | %.5s | "Hallo proggen.org" | "Hallo" | | s | Zusätzliches Argument, der dieses Argument beschreibt | %.*s | 5, "Hallo proggen.org" | "Hallo" | Beispiel: printf( "[%-.*s]\n", 5, "Hallo" ); printf( "[%-*.*s]\n", 10, 5, "Hallo" ); printf( "[%*.*s]\n", 10, 5, "Hallo" ); Ausgabe: [Hallo] [Hallo ] [ Hallo] ==== Eingabetyp ==== Der Eingabetyp beschreibt das Format des Parameters - also der Variable, die ausgegeben werden soll. ^ Kürzel ^ Platzhaltertyp ^ Interpretation ^ | h | i, d, o, u, x, X | Das Argument wird als short int (hd) oder unsigned short int (hu) interpretiert | | l | i, d, o, u, x, X | Das Argument wird als long int (ld) oder unsigned long int (lu) interpretiert | | t | i, d, o | Das Argument wird entsprechend der Größe von ptrdiff_t verwendet | | z | u, x, X | Das Argument wird entsprechend der Größe von size_t verwendet | | l | c, s | Das Argument wird als wide char (lc) oder wide string (ls) interpretiert | | L | e, E, f, g, G | Das Argument wird als long double interpretiert | ===== Die Platzhalter werden bei folgenden Funktionen verwendet ===== ^ Funktion ^ Bedeutung ^ | [[fprintf]] | Formatierte Ausgabe in einen Stream | | [[fscanf]] | Formatiertes Lesen aus einem Stream | | [[printf]] | Formatierte Ausgabe auf den stdout-Stream | | [[scanf]] | Formatiertes Lesen aus aus dem stdin-Stream | | [[sprintf]] | Formatierte Ausgabe auf einen C-String (char-Array) | | [[sscanf]] | Formatiertes Lesen aus einem C-String (char-Array) | | [[vfprintf]] | Formatierte Ausgabe in einen Stream mit Parameterliste | | [[vprintf]] | Formatierte Ausgabe auf den stdout-Stream mit Parameterliste | | [[vsprintf]] | Formatierte Ausgabe auf einen C-String (char-Array) | ===== Beispiele ===== int integer = -4711; double floatingPoint = 4711.0815; char string[] = "Hallo proggen.org"; /* Integer */ printf( "Mit Vorzeichen: %d - ohne Vorzeichen: %u", integer, integer ); printf( "Hexadezimal (kein Standard): %x\n", integer ); printf( "Oktal : %o\n", integer ); /* Fließkommazahlen */ printf( "Fließkommazahl : %f\n", floatingPoint ); printf( "Exponential : %e\n", floatingPoint ); /* Buchstaben und Strings */ printf( "Buchstabe : %c\n", string[0] ); printf( "Buchstaben : %c%c%c%c%c\n", string[0], string[11], string[2], string[3], string[4] ); printf( "String : %s\n", string );