1.1p 🚧 printf, sprintf

Formatiertes Ausgeben von Werten

Tests mit Java

public class PrintfDemo{
  public static void test(){
    String s = "Hallo";  
    System.out.printf("\fHallo zu printf \n"); // \f Konsole löschen \n neue Zeile
    System.out.printf("Strings:%n");    // %n neue Zeile
    System.out.printf(" padding:\n");
    System.out.printf("\t[%10s]\n", s); // \t Tabulator
    System.out.printf("\t[%-10s]\n", s);
    System.out.printf(" truncating:\n"); // Abschneiden, auf Größe reduzieren
    System.out.printf("\t%.4s\n", s);
    System.out.printf("Characters:\t%c %%\n", 'A');
    System.out.printf("Integers:\n");
    System.out.printf("\tDecimal:\t%d [%4d] [%-4d] [%04d] %+d %+d\n",1,2,3,4,5,-6);
    System.out.printf("\tHexadecimal:\t%x %x %X %#x %02x %#04x %#06x\n", 5, 10, 10, 6,10,10,127);
    System.out.printf("\tOctal:\t\t%o %#o %#o\n", 10, 10, 4);
    System.out.printf("Floating point:\n");
    System.out.printf("\tRounding:\t%f %.0f %.32f\n", 1.5, 1.5, 1.3);
    System.out.printf("\tPadding:\t%05.2f %.2f %5.2f\n", 1.5, 1.5, 1.5);
    System.out.printf("\tScientific:\t%E %e\n", 1.5, 1.5);
    System.out.printf("\tHexadecimal:\t%a %A\n", 1.5, 1.5);
    System.out.printf("\tSpecial values:\t0/0=%f 1/0=%f\n", 0.0/0.0, 1.0/0.0);
    System.out.printf("\tDifference f&g:\tf: %f g: %g\n", 0.00001, 0.00001);
  }
}

Ausgabe

Hallo zu printf 
Strings:
 padding:
	[     Hallo]
	[Hallo     ]
 truncating:
	Hall
Characters:	A %
Integers:
	Decimal:	1 [   2] [3   ] [0004] +5 -6
	Hexadecimal:	5 a A 0x6 0a 0x0a 0x007f
	Octal:		12 012 04
Floating point:
	Rounding:	1,500000 2 1,30000000000000000000000000000000
	Padding:	01,50 1,50  1,50
	Scientific:	1,500000E+00 1,500000e+00
	Hexadecimal:	0x1.8p0 0X1.8P0
	Special values:	0/0=NaN 1/0=Infinity
	Difference f&g:	f: 0,000010 g: 1,00000e-05

Test mit Arduino STM32

Bei dem Testprogramm wird ab Floating Point normalerweise nur noch Mist ausgegeben!
Das liegt daran, dass die Verarbeitung von Fließkommaformatierungen recht viel Programmspeicher (ca. 2,5 KiByte) benötigen würde und bei den kleinen µC dies vermieden werden sollte, so wurde der Code für Float Printf einfach weg gelassen (default).
In den Werkzeug-Einstellungen für den STM32 kann die ganze printf-Lib (+ Float Printf) eingebunden werden in dem man sie auswählt.

void setup() {
  char buf[100];
  Serial.begin(9600); // Serielle Schnittstelle starten und Baudrate festlegen
  const char* s = "Hello";
  Serial.printf("Strings:\n"); // same as puts("Strings");
  Serial.printf(" padding:\n");
  Serial.printf("\t[%10s]\n", s);
  Serial.printf("\t[%-10s]\n", s);
  Serial.printf("\t[%*s]\n", 10, s);
  Serial.printf(" truncating:\n");
  Serial.printf("\t%.4s\n", s);
  Serial.printf("\t%.*s\n", 3, s);
  Serial.printf("Characters:\t%c %%\n", 'A');
 
  Serial.printf("Integers:\n");
  Serial.printf("\tDecimal:\t%i %d %.6i %i %.0i %+i %i\n",1,2,3,0,0,4,-4);
  Serial.printf("\tHexadecimal:\t%x %x %X %#x\n",5,10,10,6);
  Serial.printf("\tOctal:\t\t%o %#o %#o\n", 10, 10, 4);
 
  Serial.printf("Floating point:\n");
  //sprintf(buf,"\tRounding:\t%f %.0f %.10f\n", 1.5, 1.5, 1.3);
  //Serial.print(buf);
  Serial.printf("\tRounding:\t%f %.0f %.10f\n", 1.5, 1.5, 1.3);
  Serial.printf("\tPadding:\t%05.2f %.2f %5.2f\n", 1.5, 1.5, 1.5);
  Serial.printf("\tScientific:\t%E %e\n", 1.5, 1.5);
  Serial.printf("\tHexadecimal:\t%a %A\n", 1.5, 1.5);
  Serial.printf("\tSpecial values:\t0/0=%g 1/0=%g\n", 0.0/0.0, 1.0/0.0);
  Serial.printf("Fixed-width types:\n");
  Serial.printf("\tLargest 32-bit value is %" PRIu32 " or %#" PRIx32 "\n",
                                   UINT32_MAX,     UINT32_MAX );
}
void loop() {
}

Ausgabe

Strings:
 padding:
	[     Hello]
	[Hello     ]
	[     Hello]
 truncating:
	Hell
	Hel
Characters:	A %
Integers:
	Decimal:	1 2 000003 0  +4 -4
	Hexadecimal:	5 a A 0x6
	Octal:		12 012 04
Floating point:
	Rounding:	1.500000 2 1.3000000000
	Padding:	01.50 1.50  1.50
	Scientific:	1.500000E+00 1.500000e+00
	Hexadecimal:	a A
	Special values:	0/0=nan 1/0=inf
Fixed-width types:
	Largest 32-bit value is 4294967295 or 0xffffffff