Ich habe ein Code-Snippet bekommen, in dem es eine gibt
printf("%.*s\n")
was bedeutet die %.*s
bedeuten?
Steven Wang
Ich habe ein Code-Snippet bekommen, in dem es eine gibt
printf("%.*s\n")
was bedeutet die %.*s
bedeuten?
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_t
etc.
– 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
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
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
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
Ohne zusätzliche Argumente ist das nicht gültig
printf
Anruf.– Andreas Marshall
26. Oktober 2011 um 5:58 Uhr