Was bedeutet “%-*.*s” in einer printf-Formatzeichenfolge?

Lesezeit: 2 Minuten

Benutzer-Avatar
Thompson

#define FMT "%-*.*s e = %6ld, chars = %7ld, stat = %3u: %c %c %c %c\n"

Dieses Makro wird an die übergeben printf Funktion. Was macht %-*.*s bedeuten?

  • SO soll nicht als Ersatz für gewöhnliche Handbuchseiten dienen. Formatbezeichner für printf sind auf jeder Manpage für diese Funktion beschrieben.

    – AnT steht zu Russland

    21. Mai 2014 um 7:47 Uhr


  • Ich habe etwas aus dieser Frage gelernt, also +1 von mir.

    – jmstoker

    21. Mai 2014 um 7:50 Uhr

  • Ich denke, die Manpage ist ausreichend schwer zu verstehen, um diese Frage zu rechtfertigen (und ich habe auch etwas gelernt, wahrscheinlich weil es nicht Teil des K&R-Printf war).

    – Peter – Setzen Sie Monica wieder ein

    21. Mai 2014 um 7:52 Uhr

  • Übrigens muss das Format kein String-Literal sein; es kann ein normaler Zeiger sein (zB char *fmt = "%d"; printf(fmt, 3);). Dies impliziert, dass Sie es auch programmgesteuert mit sprintf zusammenbauen können. Es ist ziemlich ungewöhnlich, aber bei Bedarf sehr flexibel.

    – Peter – Setzen Sie Monica wieder ein

    21. Mai 2014 um 7:57 Uhr

Benutzer-Avatar
Peter – Wiedereinsetzung von Monica

Sie können die lesen Handbuchseite für printf. Aber es ist eher ein Gesetzestext als ein Tutorial, also wird es schwer zu verstehen sein.

Ich wusste es nicht *.* und musste die Manpage selbst lesen. Es ist interessant. Beginnen wir mit einem einfachen printf("%s", "abc"). Es wird die Zeichenfolge drucken abc.

printf("%8s", "abc") wird drucken abc, einschließlich 5 führender Leerzeichen: 8 ist die “Feldbreite”. Stellen Sie sich eine Datentabelle mit Spaltenbreiten vor, sodass Daten in derselben Spalte vertikal ausgerichtet sind. Die Daten sind standardmäßig rechtsbündig, passend für Zahlen.

printf("%-8s", "abc") wird drucken abc einschließlich 5 abschließender Leerzeichen: Das Minus zeigt die linke Ausrichtung im Feld an.

Nun zum Stern:
printf("%-*s", 8, "abc") wird das gleiche drucken. Der Stern zeigt an, dass die Feldbreite (hier: 8) als Parameter an übergeben wird printf. Auf diese Weise kann es programmgesteuert geändert werden.

Nun zur “Präzision”, also:
printf("%-*.10s", 8, "1234567890123") wird nur gedruckt 1234567890wobei die letzten drei Zeichen weggelassen werden: Die “Präzision” ist die maximal Feldbreite bei Strings. Dies ist einer der seltenen Fälle (abgesehen von der Rundung, die auch durch den Genauigkeitswert gesteuert wird), in dem Daten abgeschnitten werden printf.

Und schlussendlich
printf("%-*.*s", 8, 10, "1234567890123") druckt wie zuvor, aber die maximale Feldbreite wird auch als Parameter angegeben.

  • Ich habe nur meine Antwort aufgeschrieben, weil ich nicht wusste, was das ist *.* tat entweder. Ihre Antwort ist eine bessere Erklärung.

    – jmstoker

    21. Mai 2014 um 7:48 Uhr


1187610cookie-checkWas bedeutet “%-*.*s” in einer printf-Formatzeichenfolge?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy