Mehr zur Ausgabe in C (Mehr zur Ausgabe in C), Lektion, Seite 723158
https://www.purl.org/stefan_ram/pub/ausgabe_c (Permalink) ist die kanonische URI dieser Seite.
Stefan Ram

Mehr zur Ausgabe in C 

Die Behandlung aller Details der Verwendung von »printf« wäre kompliziert und umfangreich. In dieser Lektion werden nur einige Aspekte herausgegriffen, die oft nützlich sind.

Umwandlungspezifizierer und Umwandlungsspezifikationen

Im Aufruf »printf( "%s\n", "Hallo, Welt" )« ist »%s\n« das Format, darin ist »%s« eine Umwandlungsspezifikation und »s« ein Umwandlungsspezifizierer.

Das erste Argument von »printf« wird also Format genannt, und die mit einem Prozentzeichen beginnenden Angaben darin sind Umwandlungsspezifikationen. Die Buchstaben am Ende einer Umwandlungsspezifikation sind die Umwandlungsspezifizierer.

Das nächste auf das Format folgende Argument »"Hallo, Welt"« wird gemäß der Umwandlungsspezifikation »%s« als Text dargestellt, dieser Text wird dann an der Stelle der Umwandlungsspezifikation in das Format »%s\n« eingefügt. So ergibt sich die Zeichenfolge »Hallo, Welt\n«, der dann ausgegeben wird.

printf( "%s\n", "Hallo, Welt" )
^ |
'------------'
main.c

#include <stdio.h>

int main( void )
{ printf( "%s\n", "Hallo, Welt" ); }

stdout
Hallo, Welt

Mehrere Umwandlungsspezifikationen

Im Aufruf »printf( "Hallo Welt\n" )« wird keine Umwandlungsspezifikation verwendet. Dies ist zulässig, da beliebig viele  Umwandlungsspezifikationen verwendet werden dürfen. Der Text des Formats wird dann direkt ausgegeben.

Im Aufruf »printf( "%s %s\n", "Hallo", "Welt" )« werden zwei Umwandlungsspezifikationen verwendet. Die auf das Format folgenden Argumente werden den vorhandenen Umwandlungsspezifikationen an Hand ihrer Reihenfolge zugeordnet. Das Argument »"Hallo"« wird also der ersten Umwandlungsspezifikation »%s« zugeordnet und das Argument »"Welt"« der zweiten Umwandlungspezifikation »%s«. So ergibt sich die Zeichenfolge »Hallo, Welt\n«, welche dann ausgegeben wird.

printf( "%s%s\n", "Hallo", "Welt" )
^ ^ | |
| '---------|-------'
'-----------'
main.c

#include <stdio.h>

int main( void )
{ printf( "%s%s\n", "Hallo", "Welt" ); }

stdout
HalloWelt

Direkttext im Format

Das Format kann auch Text enthalten, welcher dann in der Regel wörtlich ausgegeben wird.

Weitere Argumente werden jeweils an Stelle der Umwandlungsspezifikationen eingesetzt. Das zweite Argument erscheint an Stelle der ersten Umwandlungspezifikation, das dritte Argument erscheint an Stelle der zweiten Umwandlungsspezifikation und so weiter.

printf( "Text = %s, Zahl = %d.\n", "Hallo", 5 )

^ ^ | |
| '----------|-----'
'---------------------'

Die Funktion »printf« kann mit einer variablen Anzahl an Argumenten aufgerufen werden. Solche Funktionen werden variadisch  genannt.

main.c

#include <stdio.h>

int main( void )
{ printf( "Text = %s, Zahl = %d.\n", "Hallo", 5 ); }

stdout
Text = Hallo, Zahl = 5.
main.c

#include <stdio.h>

int main( void )
{ printf( "%s\n", "Hallo, Welt" ); }

stdout
Hallo, Welt

Das obenstehende Hallo-Welt-Programm kann also auch folgendermaßen geschrieben werden.

main.c

#include <stdio.h>

int main( void )
{ printf( "Hallo, Welt\n" ); }

stdout
Hallo, Welt

Nicht verwendete Argumente

Ein Argument, für das es keine zugehörige Umwandlungsspezifikation gibt, wird einfach ignoriert.

main.c

#include <stdio.h>

int main( void )
{ printf( "Hallo\n", "Welt" ); }

stdout
Hallo

Fehlende Argumente

Eine Umwandlungsspezifikation, für die es kein zugehöriges Argument gibt, ist ein Fehler. Dieser Fehler wird aber nicht immer vom Compiler gemeldet.

main.c

#include <stdio.h>

int main( void )
{ printf( "%s\n" ); }

Schriftzeichen

Die Umwandlungsspezifikation »%c« verlangt die Ausgabe einer int-Zahl durch das Schriftzeichen, welches diese Zahl als Kennzahl hat.

main.c
#include <stdio.h>
int main( void )
{ printf( "%d\n", 65 );
printf( "%c\n", 65 ); }
stdout
65
A
Auszug aus einer typischen Zeichentabelle

Zahl Zeichen

65  A

»puts«

Die Ausgabe eines einfachen Textes als Format mit »printf« ist etwas fehlerträchtig, da es zu Fehlern führen kann, wenn ein Prozentzeichen »%« ausgegeben werden soll und vergessen wird, dies mit der Umwandlungspezifikation »%%« zu schreiben. Die Funktion »puts« gibt Prozentzeichen hingegen stets wörtlich aus und schließt die Ausgabe stets automatisch mit einem Zeilenende ab. Daher ist »puts« gut zur Ausgabe einfacher feststehender Textzeilen geignet.

main.c

#include <stdio.h>

int main( void )
{ printf( "%%\n" );
puts( "%" ); }

stdout
%
%

»puts« muß immer mit genau einem  Argument aufgerufen werden.

»puts« kann nur zur Ausgabe von Zeichenfolgen verwendet werden, nicht zur Ausgabe von Zahlen.

Auszug aus der Dokumentation von »puts« (nach N1570, vereinfacht, überarbeitet und übersetzt)
7.21.7.9 Die Funktion »puts«
Synopsis
#include <stdio.h>
int puts( char * s );

Das Hallo-Welt-Programm kann also auch folgendermaßen geschrieben werden.

main.c

#include <stdio.h>

int main( void )
{ puts( "Hallo, Welt" ); }

stdout
Hallo, Welt

Die Verwendung von »puts« ist zur Ausgabe von Texten einfacher, da Prozentzeichen direkt ausgegeben werden und das Anfügen eines Zeilenendes nicht vergessen werden kann.

main.c

#include <stdio.h>

int main( void )
{ printf( "5 %% von 20 sind 1.\n" ); }

stdout
5 % von 20 sind 1.
main.c

#include <stdio.h>

int main( void )
{ puts( "5 % von 20 sind 1." ); }

stdout
5 % von 20 sind 1.

Festkommadarstellung ⃗³

Ein double-Wert kann auch mit der Umwandlungspezifikation »%f« ausgegeben werden, welche die Verwendung des »e« in der Ausgabe ausschließt.

main.c

#include <stdio.h>

int main( void )
{ printf( "%g\n", 1. );
printf( "%f\n", 1. );

printf( "%g\n", 1e9 );
printf( "%f\n", 1e9 );

printf( "%g\n", 1e-9 );
printf( "%f\n", 1e-9 ); }

stdout

1
1.000000

1e+009
1000000000.000000

1e-009
0.000000

Feldbreiten ⃗³

Nach einem Prozentzeichen kann auch noch eine Feldbreite  angegeben werden. Die Ausgabe wird vorne mit Leerzeichen aufgefüllt, um die angegeben Breite zu erreichen.

main.c

#include <stdio.h>

int main( void )
{ printf( "%d\n", 1 );
printf( "%d\n", 11 ); }

Protokoll
1
10
main.c

#include <stdio.h>

int main( void )
{ printf( "%2d\n", 1 );
printf( "%2d\n", 11 ); }

Protokoll
 1
10
main.c

#include <stdio.h>

int main( void )
{ printf( "%d %d\n", 1, 2 );
printf( "%d %d\n", 11, 12 ); }

Protokoll
1 2
11 12
main.c

#include <stdio.h>

int main( void )
{ printf( "%2d %2d\n", 1, 2 );
printf( "%2d %2d\n", 11, 12 ); }

Protokoll
 1  2
11 12

Nachkommastellen ⃗³

Nach einem Prozentzeichen kann auch noch ein ganzzahliges Numerale nach einem Punkt eingefügt werden, welches die Genauigkeit der Ausgabe angibt.

Die letzten Ausgabe des folgenden Programms hängen von der verwendeten Implementation ab.

main.c
#include <stdio.h>

int main( void )
{ printf( "%.2f\n", 0.1 );
printf( "%.6f\n", 0.1 );
printf( "%f\n", 0.1 );
printf( "%.17f\n", 0.1 );
printf( "%.60f\n", 0.1 ); }
stdout
0.10
0.100000
0.100000
0.10000000000000001
0.100000000000000005551115123125782702118158340454101562500000

Der Wert wird zum Erreichen der gewünschten Stellenzahl gerundet.

main.c
#include <stdio.h>

int main( void )
{ printf( "%.2f\n", 0.854 );
printf( "%.2f\n", 0.855 );
printf( "%.2f\n", 0.856 ); }
stdout
0.85
0.86
0.86

Prozentzeichen ⃗³

Ein Prozentzeichen innerhalb des Formats dient zur Kennzeichnung einer Umwandlungsspezifikation. Um ein Prozentzeichen als Zeichen in ein Format einzufügen, muß die spezielle Umwandlungsspezifikation »%%« verwendet werden, welche keinem der folgenden Argument zugeordnet wird.

main.c

#include <stdio.h>

int main( void )
{ printf( "%s\n", "%" );
printf( "%%\n" );
printf( "%d%%%d\n", 2, 4 ); }

stdout
%
%
2%4

Damit wörtliche Prozentzeichen richtig ausgegeben werden, sollten sie nicht im ersten Argument (also nicht im Format) verwendet werden (“If a conversion specification is invalid, the behavior is undefined.” – C -Norm (Stand 2018)).

main.c

#include <stdio.h>

int main( void )
{ printf( "5 % von 20 sind 1.\n" ); }

stdout
5 von 20 sind 1.

Wörtliche Prozentzeichen in späteren Argumenten werden direkt ausgegeben.

main.c

#include <stdio.h>

int main( void )
{ printf( "%s\n", "5 % von 20 sind 1." ); }

stdout
5 % von 20 sind 1.

Zusammenfassung der behandelten Umwandlungsspezifikationen ⃗³

Tabelle
%s     Einfügen eines char-*-Argumentes
%d Einfügen eines int-Arguments als Dezimalzahl
%2d Einfügen eines int-Arguments rechtsbuendig in ein Feld der Breite 2
%c Einfügen eines int-Arguments als Schriftzeichen
%g Einfügen eines double-Arguments, teilweise mit E-Schreibweise
%f Einfügen eines double-Arguments ohne E-Schreibweise
%.2f wie %f, aber mit 2 Nachkommastellen
%.6f wie %f
%.17f wie %f, aber mit 17 Nachkommastellen
%% Einfügen eines %-Zeichens

Arität von Funktionen *

Wie bei Operatoren, so spricht man auch bei Funktionen je nach der Zahl der Parameter manchmal von Funktionen mit einer bestimmten Arität (Stelligkeit).

Man sagt am besten auf deutsch sowohl für Operatoren als auch für Funktionen: nullstellig, einstellig, zweistellig, n-stellig.

Anzahl an Parametern und Aritäten

Anzahl der Parameter Art der Funktionen Beispiel

0 nullär niladisch rand
1 unär monadisch floor
2 binär dyadisch (diadisch) pow
3 ternär (trinär) triadisch
unbestimmt variadisch printf
mehr als 3 polyadisch mbrtowc

Weitere Details *

Weitere Details zur Formatierung von Zahlen finden sich in der folgenden Lektion.

>721251 Zahlenformatierung in C  *

Seiteninformationen und Impressum   |   Mitteilungsformular  |   "ram@zedat.fu-berlin.de" (ohne die Anführungszeichen) ist die Netzpostadresse von Stefan Ram.   |   Eine Verbindung zur Stefan-Ram-Startseite befindet sich oben auf dieser Seite hinter dem Text "Stefan Ram".)  |   Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram. Schlüsselwörter zu dieser Seite/relevant keywords describing this page: Stefan Ram Berlin slrprd slrprd stefanramberlin spellched stefanram723158 stefan_ram:723158 Mehr zur Ausgabe in C Stefan Ram, Berlin, and, or, near, uni, online, slrprd, slrprdqxx, slrprddoc, slrprd723158, slrprddef723158, PbclevtugFgrsnaEnz Erklärung, Beschreibung, Info, Information, Hinweis,

Der Urheber dieses Textes ist Stefan Ram. Alle Rechte sind vorbehalten. Diese Seite ist eine Veröffentlichung von Stefan Ram.
https://www.purl.org/stefan_ram/pub/ausgabe_c