|
printf gibt formatierte Ausgaben auf dem Standardausgabekanal aus. Bei Verwendung eines PC-Betriebssystems ist der Standardausgabekanal die Konsole / Terminal. Bei Verwendung mittels eines Mikrocontrollers muss je nach benutzter Hardware ein Ausgabekanal geschaffen werden, bpsw. ein angeschlossenes Display, eine Ausgabe über die serielle Schnittstelle oder anderes. Bei Verwendung mit einem Mikrocontroller ist zu überdenken, ein "full featured" printf einzusetzen, da printf sehr speicherintensiv ist, besonders in Verbindung mit der Ausgabe von Gleitkommazahlen. Ein im Leistungsumfang reduzierter, aber in vielen Fällen ausreichender Ersatz für printf ist my_printf. Syntax von
printf : int printf(const char
*format [, argument, ...]);
|
|
||||||||||||||||||||||||||||||
Prinzipiell funktionieren die Umwandlungszeichen nach folgendem Schema: Ein Umwandlungszeichen wird mit dem %-Zeichen (Ascii-Code 37) als Einleitungszeichen angegeben. Direkt anschließend an dieses Einleitungszeichens können weitere Angaben folgen:
Ein einfaches Beispiel nur mit Umwandlungszeichen (ohne Flags, ohne Feldbreite und ohne Punkt): printf("1. Zahl= %d, 2.
Zahl= %d, 3. Zahl= %d",34, 65, 99);
|
Zeichen
|
Datentyp
und Darstellung |
%d |
Integer
als dezimale Zahl ausgeben |
%i |
Integer
als dezimale Zahl ausgeben |
%c |
Ausgabe
eines char als (Ascii)-Zeichen |
%e |
Ausgabe
einer double Gleitkommazahl im wissenschaftlichen
Format (bspw.: 3.342409e+3) |
%E |
Ausgabe einer double
Gleitkommazahl im wissenschaftlichen Format (bspw.:
3.342409E+3) |
%f |
Ausgabe einer double Gleitkommazahl (bspw.: 33424.092342) |
%o |
oktale Ausgabe eines
Integers |
%p |
Ausgabe der Adresse
eines Pointers |
%s |
Ausgabe einer
Zeichenkette (String) |
%x |
Integer als hexadezimale
Zahl ausgeben, alphanumerische Ziffern werden klein
geschrieben |
%X |
Integer als hexadezimale
Zahl ausgeben, alphanumerische Ziffern werden groß
geschrieben |
%u |
Ausgabe eines
vorzeichenlosen Integers |
%% |
Ausgabe des
Prozentzeichens |
|
||||||||||||||
Direkt nach dem %-Einleitungszeichen kann ein sogenanntes Flag-Zeichen (Kennzeichnung) angegeben werden. Dieses Zeichen beeinflußt die Ausgabe auf dem Ausgabekanal.
printf("Hex-Zahl: %#x\n", 76);Hex-Zahl: 0x4c |
|
Nach den Flags können Angaben zur Gesamtzeichenanzahl der Ausgabe (Feldbreite) und / oder Angabe zur Anzahl der Nachkommastellen gemacht werden. Wird eine für die Gesamtbreite eine höhere Anzahl Stellen angegeben, als die auszugebende Zahl selbst besitzt, so wird die Ausgabe linksseitig um Leerstellen aufgefüllt, so dass die geforderte Gesamtbreite erfüllt ist. Ist als Flag die Ziffer "0" angegeben, so wird die Gesamtausgabe mit Nullen anstelle von Leerzeichen aufgefüllt. Soll eine Gleitkommazahl ausgegeben werden (float oder double), so kann die Feldbreite durch ein "." Zeichen auch den Nachkommateil beinhalten. Hierbei gibt die Angabe für die Feldbreite die Gesamtzeichenzahl der Ausgabe an, die Ziffernangabe nach dem Punkt die Anzahl der Stellen des Nachkommateils. Überschreitet die Anzahl der Zeichen für den Nachkommateil die Angabe für die Gesamtzeichenanzahl, so werden jedoch die Zeichen für den Nachkommateil garantiert ausgegeben, so dass die Gesamtzeichenanzahl der Ausgabe in diesem Fall die der angegebenen Feldbreite überschreitet. Der Punkt, der den Vorkommateil vom Nachkommateil trennt zählt hierbei als Zeichen für die Gesamtbreite. Es kann auch nur die Anzahl der Nachkommastellen ohne führende Gesamtanzahl angegeben werden. Beispiele: printf("\n1234567890");
|
|
||||||||||||||||||
Der Ausgabestring kann sogenannte Steuerzeichen (Escape-Sequenzen) enthalten. Das Ausgabeverhalten hängt vom verwendeten Terminal bzw. der verwendeten Terminalemulation ab (die Windowskonsole verhält sich leider abweichend zur Linuxkonsole). Ein Steuerzeichen wird durch einen Schrägstrich nach rechts unten (engl. backslash) "angemeldet".
Beispiel (unter Verwendung von \n \r t und Flags): // Hinweis: \r Escape-Sequenz waere fuer Programmlauf unter Linux nicht notwendig
printf("\n\rQuadratzahlen\t Wurzel\t\t Reziprokenwerte");
printf("\n\r---------------------------------------------------\n\r");
for (i= 1; i< 17; i++)
{
printf("\n\r %2d * %2d= %4d\t sqrt(%2d)= %4.2f\t 1/%2d= %.4f", \
i, i, i*i, i, sqrt((float)i), i, 1.0/(float)i);
}
Ausgabe: Quadratzahlen Wurzel Reziprokenwerte --------------------------------------------------- 1 * 1= 1 sqrt( 1)= 1.00 1/ 1= 1.0000 2 * 2= 4 sqrt( 2)= 1.41 1/ 2= 0.5000 3 * 3= 9 sqrt( 3)= 1.73 1/ 3= 0.3333 4 * 4= 16 sqrt( 4)= 2.00 1/ 4= 0.2500 5 * 5= 25 sqrt( 5)= 2.24 1/ 5= 0.2000 6 * 6= 36 sqrt( 6)= 2.45 1/ 6= 0.1667 7 * 7= 49 sqrt( 7)= 2.65 1/ 7= 0.1429 8 * 8= 64 sqrt( 8)= 2.83 1/ 8= 0.1250 9 * 9= 81 sqrt( 9)= 3.00 1/ 9= 0.1111 10 * 10= 100 sqrt(10)= 3.16 1/10= 0.1000 11 * 11= 121 sqrt(11)= 3.32 1/11= 0.0909 12 * 12= 144 sqrt(12)= 3.46 1/12= 0.0833 13 * 13= 169 sqrt(13)= 3.61 1/13= 0.0769 14 * 14= 196 sqrt(14)= 3.74 1/14= 0.0714 15 * 15= 225 sqrt(15)= 3.87 1/15= 0.0667 16 * 16= 256 sqrt(16)= 4.00 1/16= 0.0625 |
|
sprintf verhält sich genau wie printf mit dem Unterschied, dass die Ausgabe nicht auf dem Standardausgabekanal, sondern in einen String (d.h. in ein Char-Array) erfolgt. Syntax von sprintf : int
sprintf(char *buffer, const char *format [, argument,
...]);
|
|
|||||||||||||||||||||
my_printf ist ein in der Funktionalität reduzierter Ersatz für den jedem C-Compiler beiliegenden printf und ist speziell für die Benutzung in Verbindung mit Mikrocontrollern gedacht. my_printf macht immer dann Sinn, wenn es darum geht Flashspeicher zu sparen und ermöglicht den Einsatz auf Mikrocontrollersystemen ab ca. 2 kByte Flashspeicher.
Die Syntax von my_printf : void my_printf(const char *s,...);
|
|
Zeichen
|
Datentyp
und Darstellung |
%d |
Integer als dezimale Zahl ausgeben (int ist 16-Bit Wert auf einem 8-Bit System, ein 32-Bit Wert auf einem 32-Bit Systemen |
%l |
nur bei printf32.c : 32-Bit Integerwert ausgeben (verfügbar für AVR, STM8 und MCS-51) |
%c |
Ausgabe eines char als (Ascii)-Zeichen |
%k |
(Pseudo-Kommazahl) Integerwert mit eingesetztem Dezimalpunt ausgeben, auf 32-Bit Systemen oder bei my_printf32 als 32-Bit Wert, ansonsten als 16-Bit Wert. Mit dem Wert in der globaler Variable printfkomma wird angegeben, an welcher Position bei der Ausgabe ein Dezimalpunkt eingefügt wird. |
%f |
nur bei my_printf_float.c, Ausgabe eines (float) Gleitkommawertes. Ein Punkt zur Angabe der Nachkommastellen wird interpretiert |
%s |
Zeichenkette (String) ausgeben |
%x |
Integer als hexadezimale Zahl ausgeben |
%% |
Ausgabe des Prozentzeichens |
#define printf my_printf
int a,a2,b,c;
printf("\n\r ASCII-Zeichen '%c' = dezimal %d = hexadezimal 0x%x\n\r", 'M', 'M', 'M');
a= 42; b= 13;
// Variable a um eine Zehnerstelle nach links,
// um spaeter eine Nachkommastelle anzeigen zu koennen
a2= a*100;
c= a2 / b;
printfkomma= 2;
printf(" %d / %d = %k", a, b, c);