Was bedeutet “%.*s” in printf?

Lesezeit: 3 Minuten

Benutzeravatar von StevenWang
Steven Wang

Ich habe ein Code-Snippet bekommen, in dem es eine gibt

printf("%.*s\n")

was bedeutet die %.*s bedeuten?

  • Ohne zusätzliche Argumente ist das nicht gültig printf Anruf.

    – Andreas Marshall

    26. Oktober 2011 um 5:58 Uhr

Benutzeravatar von AusCBloke
AusCBloke

Sie können ein Sternchen (*), um den Breitenbezeichner/die Genauigkeit zu übergeben printf()anstatt es fest in die Formatzeichenfolge zu codieren, dh

void f(const char *str, int str_len)
{
  printf("%.*s\n", str_len, str);
}

  • Zu beachten ist, dass die str_len Argument muss einen Typ haben int (oder ein schmalerer ganzzahliger Typ, zu dem befördert würde int). Es wäre ein Bug zu passieren long, size_tetc.

    – MM

    7. Juli 2015 um 22:03 Uhr


  • Es ist erwähnenswert, dass der wahrscheinliche Zweck dieses Codes, insbesondere wenn er mit verwendet wird %s, besteht darin, eine Teilzeichenfolge der ursprünglichen Zeichenfolge zu drucken. In diesem Anwendungsfall str würde irgendwo innerhalb der ursprünglichen Zeichenfolge (möglicherweise am Anfang) zeigen, und str_len gibt die Länge der Teilzeichenfolge an, die gedruckt werden soll.

    – Schallatom

    25. Januar 2016 um 13:37 Uhr


  • Indem wir eine Länge angeben, können wir das Drucken (oder Sprinten) einer Zeichenfolge umgehen, die kein Null-Terminator hat, z. B. eine Zeichenfolge, die von einer beliebigen Stream- oder dateibasierten Quelle eingegeben wird. Das ist weitaus häufiger der Anwendungsfall, dem ich begegnet bin, als nur Schönheiten zu drucken.

    Benutzer337598

    24. Oktober 2018 um 8:04 Uhr

Ondrejs Benutzeravatar
Ondrej

Genauer hier.

ganzzahliger Wert oder * die die minimale Feldbreite angibt. Das Ergebnis wird (standardmäßig) bei Bedarf links mit Leerzeichen aufgefüllt, wenn es rechtsbündig ist, oder rechts, wenn es linksbündig ist. Bei Verwendung von * wird die Breite durch ein zusätzliches Argument vom Typ int angegeben. Wenn der Wert des Arguments negativ ist, ergibt es sich mit dem angegebenen -Flag und positiver Feldbreite. (Hinweis: Dies ist die Mindestbreite: Der Wert wird nie abgeschnitten.)

. gefolgt von einer ganzen Zahl oder * oder keines von beidem, das die Genauigkeit der Konvertierung angibt. Bei Verwendung von * wird die Genauigkeit durch ein zusätzliches Argument vom Typ int angegeben. Wenn der Wert dieses Arguments negativ ist, wird es ignoriert. Wenn weder eine Zahl noch * verwendet wird, wird die Genauigkeit als Null angenommen. In der folgenden Tabelle finden Sie die genauen Auswirkungen der Präzision.

Wenn wir also beide Konvertierungsspezifikationen ausprobieren

#include <stdio.h>

int main() {
    int precision = 8;
    int biggerPrecision = 16;
    const char *greetings = "Hello world";

    printf("|%.8s|\n", greetings);
    printf("|%.*s|\n", precision , greetings);
    printf("|%16s|\n", greetings);
    printf("|%*s|\n", biggerPrecision , greetings);

    return 0;
}

wir bekommen die Ausgabe:

|Hello wo|
|Hello wo|
|     Hello world|
|     Hello world|

  • Aus der Dokumentation geht hervor, dass der Hauptunterschied zwischen „%.*s“ und „%*s“ darin zu bestehen scheint, dass Ersteres negative Werte für die Genauigkeit ignoriert, während Letzteres berücksichtigt, um die entsprechende Begründung anzuwenden.

    – Stromquelle97

    17. September 2021 um 3:03 Uhr

  • Sie könnten auch hinzufügen printf("|%.*s|\n", biggerPrecision , greetings);

    – Kenn

    27. Dezember 2021 um 20:50 Uhr

Benutzeravatar von rerun
Wiederholung

Ich denke nicht, dass der obige Code korrekt ist, aber (gemäß dieser Beschreibung von printf()) das .* meint

Die Breite wird nicht im Format-String angegeben, sondern als zusätzliches Integer-Wert-Argument vor dem zu formatierenden Argument.’

Es ist also ein String mit passabler Breite als Argument.

  • Ich habe den URL-Querverweis hinzugefügt, damit Sie Plagiatsvorwürfe vermeiden können. Das korrekte Zitat lautet natürlich „The Präzision ist nicht …“ statt „Die Breite ist nicht…”.

    – Jonathan Leffler

    30. März 2015 um 4:52 Uhr

  • Wie @MattMcNabb betonte, muss jeder Verweis auf diese Seite hervorheben, dass „ein ganzzahliger Wert” ist genau int (oder eine Teilmenge davon) – nicht irgendein ganzzahliger Wert wie intuitiver size_t oder seine möglichen Aliase, wie std::string::size_type. Dies ist noch verwirrender, wenn man bedenkt, dass die referenzierte Seite erwähnt size_t als einer der unterstützten Typbezeichner.

    – Anton Samsonow

    4. August 2015 um 18:04 Uhr

Joshs Benutzeravatar
Josch

Sehen: http://www.cplusplus.com/reference/clibrary/cstdio/printf/

.* Die Genauigkeit wird nicht im Formatstring angegeben, sondern als zusätzliches ganzzahliges Argument vor dem zu formatierenden Argument.

s Zeichenfolge

1424250cookie-checkWas bedeutet “%.*s” in printf?

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

Privacy policy