Formatbezeichner in C

Muhammad Husnain 12 Oktober 2023
Formatbezeichner in C

In diesem Artikel geht es um die Verwendung der Funktion printf in der Sprache C und den in dieser Funktion verwendeten Formatbezeichner. In diesem Artikel wird ausführlich die Syntax von Formatbezeichnern erörtert und wie sie für verschiedene Datentypen verwendet werden.

Schauen wir uns zunächst die Syntax der Funktion printf an.

Formatspezifizierer in der Funktion printf() in C

Die Syntax der Funktion printf() lautet:

int printf(const char* format, ...);

Diese Funktion schreibt den in der Variablen format gespeicherten String auf die Standard-Ausgabekonsole. Wenn diese Zeichenfolge Formatbezeichner enthält, d. h. einige Teilzeichenfolgen, die mit dem Symbol % beginnen, um einige Variablen anzugeben, werden diese durch die nach der Zeichenfolge angegebenen Werte ersetzt.

Parameter:

  • format

In diesem C-String wird der auszugebende Text abgelegt. Es kann optional eingebettete Formatbezeichner enthalten, die durch die in den nächsten zusätzlichen Argumenten bereitgestellten Werte ersetzt und nach Bedarf formatiert werden.

Ein Formatbezeichner folgt dem folgenden Muster:

%[flags][width][.precision][length]specifier

Die eckigen Klammern [] zeigen an, dass diese Bezeichner optional sind. Beispiel: printf("%lu",4294967295) bedeutet print 4294967295 im unsignierten Langformat.

Dabei ist l ein Längenbezeichner für long int und u ein Bezeichner für unsigned Zahlen. Die restlichen optionalen Argumente werden ignoriert.

Der Spezifizierer am Ende dieses Musters ist der wichtigste Teil, da er die Art der zu druckenden Daten definiert. Die Liste der verschiedenen Spezifizierer und ihrer Beschreibungen ist in der folgenden Tabelle aufgeführt:

Spezifizierer Beschreibung
d oder i vorzeichenbehaftete Dezimalzahl
u Dezimalzahl ohne Vorzeichen
o vorzeichenlose Oktalzahl
x vorzeichenlose Hexadezimalzahl
X unsigned hexadezimal in Großbuchstaben
f Dezimalkommazahl in Kleinbuchstaben
F dezimale Gleitkommazahl in Großbuchstaben
c Charakter
s Schnur
a hexadezimales Gleitkomma in Kleinbuchstaben
A hexadezimaler Fließkommawert in Großbuchstaben
p Zeigeradresse

Die verbleibenden Unterspezifizierer vor dem Spezifizierer sind alle optional, aber ihr Zweck wird unten definiert.

Flaggen:

Flaggen Beschreibung
- für die linke Ausrichtung des Felds.
+ Platzieren Sie zwangsweise ein Pluszeichen vor positiven Zahlen
# Wird für oktale und hexadezimale Spezifizierer (o,x,X) verwendet, um 0, 0x bzw. 0X zu platzieren.
0 fügt 0 links vom Wert hinzu.

Breite:

Breite Beschreibung
(number) legt die Mindestanzahl der zu druckenden Zeichen fest.
* Die Breite wird als zusätzliches Integer-Wert-Argument vor dem zu formatierenden Argument geliefert und nicht in der Formatzeichenfolge.

Präzision:

Präzision Beschreibung
.number Gibt die Mindestanzahl der zu druckenden Stellen an. Hat die Nummer weniger Stellen, werden diese links mit Nullen aufgefüllt.
.* Die Genauigkeit wird als zusätzliches Integerwert-Argument vor dem zu formatierenden Argument und nicht in der Formatzeichenfolge angegeben.

Länge:

Länge Beschreibung
hh Gibt an, dass printf ein ganzzahliges Argument der Größe int annimmt, das von einem char für ganzzahlige Typen heraufgestuft wird.
h Gibt an, dass printf ein Integer-Argument der Größe Int annimmt, das von einem short für Integer-Typen heraufgestuft wird.
l Gibt an, dass printf ein langes Integer-Argument für Integer-Typen annimmt. Bei Fließkommatypen wird dies ignoriert. Bei Verwendung von varargs werden Float-Argumente automatisch auf double hochgestuft.
ll Gibt an, dass printf ein langes, großes Integer-Argument für Integer-Typen annimmt.
L Gibt an, dass printf ein langes doppeltes Argument für Gleitkommatypen annimmt.
z Gibt für Integer-Typen printf an, um ein Integer-Argument der Größe size_t anzunehmen.
j Gibt für Integer-Typen printf an, um ein Integer-Argument der Größe intmax_t anzunehmen.
t Gibt für Integer-Typen printf an, um ein Integer-Argument der Größe ptrdiff_t anzunehmen.
  • ...

Die Funktion erwartet möglicherweise eine Folge zusätzlicher Argumente, von denen jedes einen Wert enthält, um einen Formatbezeichner in der Formatzeichenfolge zu ersetzen, abhängig von der Formatzeichenfolge (oder einem Zeiger auf einen Speicherort für n).

Die Anzahl dieser Parameter sollte mindestens gleich der Anzahl der Werte sein, die in den Formatbezeichnern angegeben sind. Die Funktion ignoriert alle zusätzlichen Argumente.

Rückgabewert:

Die Gesamtzahl der geschriebenen Zeichen wird zurückgegeben, wenn die Operation erfolgreich ist. Die Fehleranzeige (ferror) wird gesetzt und bei einem Schreibfehler eine negative Ganzzahl zurückgegeben.

Errno wird auf EILSEQ gesetzt, und es wird eine negative Ganzzahl ausgegeben, wenn beim Schreiben von Breitzeichen ein Multibyte-Zeichencodierungsfehler auftritt.

Beispiel:

#include <stdio.h>

int main() {
  printf("Some Character values: %c %c \n", 'b', 66);
  printf("Some Decimal Value: %d %ld\n", 1234, 670000L);
  printf("Numbers preceeding with blank spaces: %10d \n", 1234);
  printf("Numbers preceeding with zeros: %010d \n", 1235);
  printf("Different number systems: %d %x %o %#x %#o \n", 100, 100, 100, 100,
         100);
  return 0;
}

Ausgang:

Some Character values: b B
Some Decimal Value: 1234 670000
Numbers preceeding with blank spaces:       1234
Numbers preceeding with zeros: 0000001235
Different number systems: 100 64 144 0x64 0144
Muhammad Husnain avatar Muhammad Husnain avatar

Husnain is a professional Software Engineer and a researcher who loves to learn, build, write, and teach. Having worked various jobs in the IT industry, he especially enjoys finding ways to express complex ideas in simple ways through his content. In his free time, Husnain unwinds by thinking about tech fiction to solve problems around him.

LinkedIn