4.2 Formatierte Ausgabe mit »printf()« 

Die Syntax von printf() sieht so aus:
#include <stdio.h> int printf(const char * restrict format, ...);
Der Rückgabewert von printf() ist die Anzahl der Zeichen, die ausgegeben werden (ohne das Terminierungszeichen '\0'), oder im Fehlerfall EOF. Folgendes Beispiel demonstriert dies:
/* printf1.c */ #include <stdio.h> int main(void) { int zeichen; zeichen = printf("Hallo Welt"); printf(" enthaelt %d Zeichen\n", zeichen); // 10 Zeichen return 0; }
printf() bekommt mindestens einen Parameter, nämlich den Formatstring. Dieser Formatstring besteht wiederum aus einem Ausgabetext (Stringkonstante), der nullterminiert ist (\0), und/oder aus einer Formatanweisung.
Abbildung 4.6 »printf()«, in seine einzelnen Bestandteile zergliedert
Bei dem Formatstring handelt es sich um eine Zeichenkette beliebiger Länge. Zum Beispiel:
printf("Ich bin der Formatstring in der printf-Anweisung");
Achtung |
Das mit der »beliebigen Länge« stimmt nicht ganz. Auch mit printf() kann es einen Pufferüberlauf geben, sollte der Text länger sein als erlaubt. Ein Pufferüberlauf (Buffer-Overflow) wird in Hacker-Kreisen gern verwendet, um an Root-Rechte (Rechte des Systemadministrators) zu kommen. Bei mehr als 4096 Zeichen würde printf() laut C99-Standard Probleme bekommen (bei dem C89-Standard wird es ab 512 Zeichen gefährlich). Microsoft Visual C++ verweigert außerdem bei mehr als 65.535 Zeichen die Übersetzung (Compiler-Limit). |
Die Funktion printf() wird bei der Ausführung von rechts nach links abgearbeitet. Dabei sucht die Funktion nach einem Ausgabetext (Stringkonstante) und Formatanweisungen.
Diese Formatanweisung wird von printf() dann mit entsprechenden Parametern der variablen Liste ausgegeben. Formatanweisungen beginnen alle mit einem %-Zeichen. Dahinter folgt ein Buchstabe, der den Datentyp des Formates angibt. %d steht z. B. für eine dezimale Ganzzahl. Die Formatanweisung lässt sich natürlich noch erweitert formatieren.
Bevor ich die einzelnen und erweiterten Formatanweisungen vorstelle, folgt erst einmal ein Kapitel, das zeigt, was für Datentypen Sie überhaupt zur Verfügung haben.
Die Ausgabe von printf() muss übrigens nicht ausschließlich auf dem Bildschirm erfolgen. Sie können die Standardausgabe (stdout) auch in eine Datei umleiten:
/* printf2.c */ #include <stdio.h> int main(void) { printf("Diese Ausgabe soll in einer Textdatei stehen\n"); return 0; }
Übersetzen Sie dieses Programm wie gewohnt, und starten Sie es, indem Sie in einer Konsole Folgendes eingeben (als Programmname sei hier out gegeben):
$ out > test.txt
Jetzt befindet sich im aktuellen Verzeichnis eine Datei namens test.txt mit dem Inhalt, den printf() normalerweise auf dem Bildschirm ausgegeben hätte.
Anmerkung des Autors |
Sicherlich stellt sich der eine oder andere die Frage, warum ich schon zu Beginn des Kapitels auf die Schwachstellen von printf() und scanf() hingewiesen habe und dennoch auf diese Funktionen eingegangen bin. Ich habe es nur den Anfängern zuliebe getan. Zwar richtet sich dieses Buch nicht nur an Anfänger, aber würde ich gleich auf die sicheren Alternativen eingehen, so würde dies einem absoluten Einsteiger zu viel abverlangen. Ich müsste auf eine Menge Themen vorgreifen. Und wenn man schon am Anfang eines Buches auf Themen stößt, die sich vielleicht erst ein paar hundert Seiten später auflösen, dann kann dies sehr frustrierend sein. |
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.