Formatierte Ein-/Ausgabe
C Programming: A Modern Approach — K. N. King
Wahlpflichtfach Informatik
printf — Formatierte Ausgabescanf — Formatierte EingabeGibt den Inhalt eines Formatstrings aus, wobei Werte an markierten Stellen eingefügt werden.
printf(formatstring, ausdruck1, ausdruck2, ...);
%m.pX oder %-m.pX
m = Minimale Feldbreite (optional)p = Genauigkeit (optional)X = Umwandlungsspezifizierer (d, f, e, g)- = Linksbündige Ausgabe| Aufruf | Ausgabe | Erklärung |
|---|---|---|
printf("%4d", 123) |
·123 |
Rechtsbündig, 1 Leerzeichen |
printf("%4d", 12345) |
12345 |
Feld wird automatisch erweitert |
printf("%-4d", 123) |
123· |
Linksbündig |
· steht hier für ein Leerzeichen.
| Spec | Beschreibung | Beispiel |
|---|---|---|
%d |
Ganzzahl (Dezimal) | printf("%4d", 42) → ··42 |
%f |
Float (Dezimalform) | printf("%.2f", 3.14) → 3.14 |
%e |
Float (Exponentialform) | printf("%e", 3.14) → 3.140000e+00 |
%g |
Float (%e oder %f, kürzer) | printf("%g", 0.0001) → 0.0001 |
| Spezifizierer | Bedeutung von p |
|---|---|
%d | Mindestanzahl Ziffern (Standard: 1) |
%f, %e | Nachkommastellen (Standard: 6) |
%g | Signifikante Stellen (Standard: 6) |
printf("%10.3f", 3.14159); /* ·····3.142 */
printf("%.2f", 83.162); /* 83.16 */
printf("%.4g", 123456.0); /* 1.235e+05 */
| Sequenz | Wirkung |
|---|---|
\n | Zeilenumbruch |
\t | Tabulator |
\\ | Einzelnes Backslash-Zeichen |
\" | Anführungszeichen im String |
\a | Akustisches Signal |
%% | Einzelnes Prozentzeichen |
printf("Item\tUnit\tPurchase\n\tPrice\tDate\n");
printf("Gewinn: %d%%\n", 10); /* Gewinn: 10% */
printf("\"Hallo!\""); /* "Hallo!" */
printf("Item\tUnit\tPurchase\n\tPrice\tDate\n");
Erzeugt:
Liest Eingaben gemäß einem Formatstring und speichert sie in Variablen.
int i, j;
float x, y;
scanf("%d%d%f%f", &i, &j, &x, &y);
scanf("%d%d%f%f", &i, &j, &x, &y);
/* Eingabe (3 Zeilen):
1
-20 .3
-4.0e3
→ i=1, j=-20, x=0.3, y=-4000.0 */
scanf("%d%d%f%f", &i, &j, &x, &y);
/* Eingabe: 1-20.3-4.0e3 */
%d → liest 1, stoppt bei - (zurückgelegt)%d → liest -20, stoppt bei . (zurückgelegt)%f → liest .3, stoppt bei - (zurückgelegt)%f → liest -4.0e3/* Erwartet z.B. "2/17" */
scanf("%d/%d", &monat, &tag);
/* Erwartet z.B. "4,28" */
scanf("%d,%d", &i, &j);
4 28 bei "%d,%d" → scanf bricht ab! Komma fehlt.
printf("%d %d\n", &i, &j); /* FALSCH! */
printf("%d %d\n", i, j); /* Richtig */
Gibt seltsame Zahlen (Speicheradressen) statt Werte aus.
scanf("%d\n", &i); /* FALSCH! */
scanf("%d", &i); /* Richtig */
\n wirkt in scanf wie ein Leerzeichen — Programm hängt, bis der Benutzer ein nicht-leeres Zeichen eingibt.
scanf("%d, %d", &i, &j); /* Erwartet Komma! */
Wenn der Benutzer 4 28 eingibt (ohne Komma), wird j nicht gelesen.
#include <stdio.h>
int main(void)
{
int num1, denom1, num2, denom2,
result_num, result_denom;
printf("Ersten Bruch eingeben: ");
scanf("%d/%d", &num1, &denom1);
printf("Zweiten Bruch eingeben: ");
scanf("%d/%d", &num2, &denom2);
result_num = num1 * denom2 + num2 * denom1;
result_denom = denom1 * denom2;
printf("Die Summe ist %d/%d\n",
result_num, result_denom);
return 0;
}
scanf("%d/%d", ...) nutzt / als Trennzeichena/b + c/d = (a·d + c·b) / (b·d)%d → nur Dezimalzahlen%i → erkennt auch Oktal (056) und Hex (0x56)0 bei %i wird als Oktalzahl interpretiert!%d bleiben.
printf("Zahl eingeben: ");
scanf("%d", &i);
23foo → i = 23, foo bleibt im Pufferfoo → i undefiniert, foo bleibt im Pufferscanf auswerten (Details in Kapitel 22).
scanf("%d%d", &i, &j);
/* Eingabe: 4,28 → i=4, j wird NICHT gelesen */
Lösung: Komma im Formatstring:
scanf("%d,%d", &i, &j);
/* Eingabe: 4,28 → i=4, j=28 ✓ */
Welche Ausgabe erzeugen diese Aufrufe?
| Aufruf | Ausgabe |
|---|---|
printf("%6d,%4d", 86, 1040) |
····86,1040 |
printf("%12.5e", 30.253) |
·3.02530e+01 |
printf("%.4f", 83.162) |
83.1620 |
printf("%-6.2g", .0000009979) |
1e-06· |
scanf("%d%f%d", &i, &x, &j);
/* Eingabe: 10.3 5 6 */
| Variable | Wert | Erklärung |
|---|---|---|
i | 10 | Stoppt am Punkt |
x | 0.3 | Liest .3 als Float |
j | 5 | Nächste Ganzzahl |
6 bleibt im Eingabepuffer.
scanf("%f%d%f", &x, &i, &y);
/* Eingabe: 12.3 45.6 789 */
| Variable | Wert | Erklärung |
|---|---|---|
x | 12.3 | Vollständiger Float |
i | 45 | Stoppt am Punkt |
y | 0.6 | Liest .6 als Float |
789 bleibt im Eingabepuffer.
Sind diese Paare gleichwertig?
| Paar | Gleichwertig? |
|---|---|
"%d" vs. " %d" |
Ja — %d überspringt Whitespace |
"%d-%d-%d" vs. "%d -%d -%d" |
Nein — Leerzeichen überspringt extra Whitespace |
"%f" vs. "%f " |
Nein — nachstehendes Leerzeichen → hängt |
"%f,%f" vs. "%f, %f" |
Ja — Leerzeichen vor %f ist redundant |
Datum im Format mm/dd/yyyy einlesen, als yyyymmdd ausgeben.
scanf("%d/%d/%d", &m, &d, &y) für die Eingabe verwenden.
Hinweis: Tabs (\t) für Spaltenausrichtung verwenden.
scanf mit - als Trennzeichen. Gruppengrößen variieren!
16 Zahlen einlesen, als 4×4-Feld anzeigen, Zeilen-/Spalten-/Diagonalsummen berechnen.
Beide Brüche auf einmal eingeben, getrennt durch +:
scanf("%d/%d+%d/%d", &n1, &d1, &n2, &d2)
| Thema | Kernpunkte |
|---|---|
printf |
%m.pX für Feldbreite, Genauigkeit, Typ |
| Escape-Sequenzen | \n, \t, \\, \", %% |
scanf |
& nicht vergessen! Whitespace wird übersprungen |
| Formatstrings | Zeichen im Format müssen in der Eingabe vorkommen |
| Typische Fallen | Kein \n in scanf, & nicht in printf |
Fragen?