Die Funktion printf()

Der Befehl 'printf' kann nämlich noch mehr, als nur Daten rauswerfen: Gleichzeitig kann man die Daten auch noch formatieren. Das Steuerzeichen ' ' kennen Sie ja schon, aber es gibt auch eine einfache Möglichkeit, Strings in eine Ausgabe hineinzuformatieren. Oder Zahlen zu schreiben. Die normale Ausgabe, die wir benutzen, in zum Beispiel

printf("Hello World\n");

ist ein Formatierungsstring, ohne Formatierungszeichen. Daher wird er genauso ausgegeben, wie er da steht. Es erscheint 'Hallo World' auf dem Bildschirm.

dynamisch Informationen in den String einbauen ausgeben

Benutzt man Sonderzeichen wie '%s' und '%d', so kann man Variablen in den String einbauen, so wie es im Beispiel unten gezeigt wird. Dabei wird für %d eine Zahl eingesetzt, für %s ein String. Die Ausgabeanweisungen (also %s oder %d) sollten mit dem Datentyp der Variable natürlich auch übereinstimmen. Printf nimmt die Variablen nämlich in der Reihenfolge, wie sie hinter dem Formatierungsstring übergeben werden. Also das erste %s oder %d Sonderzeichen wird mit der ersten Variable hinter dem Formatierungsstring gefüllt, das zweite Sonderzeichen mit der 2. Variablen und so weiter. Viele komplizierte Worte, seht euch einfach das Beispiel an:

void MeinPrintf(long Modus, char *MeinString)
{
  printf("Gewählter Modus: %d\n", Modus);
 
  if(Modus == 1) printf("Ich aber sage euch: %s\n", MeinString);
  else if(Modus == 2) printf("Das Wort \'%s\' hat nichts zu sagen.\n", MeinString);
  else if(Modus >= 3) printf("Modus %d unbekannt. Ausgabe: %s\n", Modus, MeinString);
}
 
int main(void)
{
  MeinPrintf(1, "Fürchtet euch nicht, BimBam liebt euch!");
  MeinPrintf(2, "Halleluja");
  return 0;
}

Anderes Beispiel:

void Addiere(long Zahl1, long Zahl2)
{
  printf("%d plus %d ergibt %d\n", Zahl1, Zahl2, Zahl1+Zahl2);
}
 
int main(void)
{
  Addiere(4, 8);
  return 0;
}

Gebrochene Zahlen können mittels %f ausgegeben werden:

int main(void)
{
  float Wert=3.1;
 
  printf("Wert = %f\n", Wert);
  return 0;
}

Hier eine kleine Tabelle zu den wichtigsten Datentypen:

Sonderzeichen Bedeutung
%d Integer (32 Bit, mit Vorzeichen)
%u Integer (32 Bit, positiv, ohne Vorzeichen)
%hu liest weiterhin ein int, konvertiert es jedoch zu unsigned short int
%x, %X integer in hexadezimaler Schreibweise (hex, kein Standard!)
%o Integer in oktaler Schreibweise
%f Fließkommazahl
%e, %E Fließkommazahl in Exponentialdarstellung
%c Wert als ASCII-Zeichen (character)
%s Adresse als Zeichenkette (String)

Es kann auch festgelegt werden, wieviele Nachkommastellen ausgegeben werden sollen. Bei zwei Nachkommastellen sieht die Ausgabe dann folgendermaßen aus:

int main(void)
{
  float Wert=3.1415;
 
  printf("Wert = %.2f\n", Wert);
  return 0;
}

Möchte man einen String nicht ausgeben, sondern sich lediglich einen String dynamisch zusammenbauen lassen, kann man sich die Funktion sprintf() ansehen.

Sonderzeichen in einen String einfügen

In einen String kann man nicht alle Zeichen schreiben. Einige Zeichen sind auf der Tastatur nicht zu finden, bzw. lassen sich nicht mit einem Texteditor eingeben. Dazu gehört zum Beispiel das NewLine-Zeichen, dass dafür sorgt, dass der folgende Text in der nächsten Zeile dargestellt wird.

Hierfür wird mit Hilfe des Backslashs ('\') ein sogenanntes Escape-Zeichen gesetzt. Das folgende Zeichen wird nun nicht dem String hinzugefügt, sondern interpretiert. \n wird so als Newline Zeichen angegesenen, so dass man mit einem String und einem printf gleich mehrere Zeilen ausgeben kann:

printf( "Hallo Welt\nZeile 2\nZweile3\n" );

Es gibt eine Reihe von Sonderzeichen, hier die Wichtigsten:

Sonderzeichen Ausgabe
\n NewLine
\t Tab-Zeichen
\c Carrier return (Cursor nach ganz links)

Backslash ('\')
\“ Anführungszeichen
\xXX Hexadezimales Zeichen, wobei XX für eine zweistellige hexadezimale Zahl zu ersetzen ist, z.B. \x27 für das Escape-Taste

ein vergessenes NewLine-Zeichen

Vergisst man das Newline-Zeichen am Ende, so wird der Text zunächst nicht ausgegeben, sondern wird im Speicher zurückgehalten. Die meisten Konsolen geben einen Text erst aus, wenn sie eine vollständige Zeile Text im Speicher haben. Das stammt noch aus einer Zeit, als Konsolen mit 300Baud (quasi DSL 0.3) an einen Computer angeschlossen waren. Möchte man zum Beispiel einzelne Zeichen ausgeben, so muss man die Funktion fflush verwenden:

  printf( "arbeite..." ); 
  flush( stdout );
 
  doSomething();
 
  printf( "fertig!\n" );

stdout gibt fflush() die Information, dass der Standard-Output 'herausgespült' werden soll.

Stürzt ein Programm während der Ausführung ab, so wird der Inhalt des Textbuffers nicht mehr ausgegeben. Wer also mit printf() Meldungen ausgibt, um sein Programm von Fehlern zu befreien, sollte darauf achten jeden printf()-Text mit \n abzuschließen, oder fflush() aufzurufen.


Diskussionsseite