Wat betekent “%.*s” in printf?

Ik heb een codefragment met een

printf("%.*s\n")

wat betekent de %.*s?


Antwoord 1, autoriteit 100%

U kunt een asterisk (*) gebruiken om de breedtespecificatie/precisie door te geven aan printf(), in plaats van het hard te coderen in de format string, dat wil zeggen

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

Antwoord 2, autoriteit 22%

Meer gedetailleerde hier.

gehele waarde of *die de minimale veldbreedte aangeeft. Het resultaat is opgevuld met spatietekens (standaard), indien nodig, aan de linkerkant als rechts uitgelijnd, of aan de rechterkant als links uitgelijnd. In het geval dat * wordt gebruikt, wordt de breedte gespecificeerd door een extra argument van het type int. Als de waarde van het argument negatief is, resulteert dit met de opgegeven vlag – en een positieve veldbreedte. (Opmerking: dit is de minimale breedte: de waarde wordt nooit afgekapt.)

.gevolgd door een geheel getal of *, of geen van beide specificeert precisie
van de conversie. In het geval dat * wordt gebruikt, is de precisie
gespecificeerd door een extra argument van het type int. Als de waarde hiervan
argument is negatief, het wordt genegeerd. Als noch een getal noch * is
gebruikt, wordt de precisie als nul genomen. Zie de onderstaande tabel voor exacte
effecten van precisie.

Dus als we beide conversiespecificaties proberen

#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;
}

We krijgen de uitvoer:

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

Antwoord 3, Autoriteit 9%

Ik denk niet dat de bovenstaande code correct is, maar (volgens deze beschrijving van printf()) De .*betekent

De breedte is niet gespecificeerd in de indelingsstring, maar als een aanvullend getal-waardeargument voorafgaand aan het argument dat moet worden geformatteerd. ‘

Dus het is een tekenreeks met een doorbijdaandwaardige breedte als een argument.


Antwoord 4, Autoriteit 7%

Zie: http://www.clusplus.com/reference/clibrary/cstdio / printf /

.*De precisie is niet gespecificeerd in de indelingsstring, maar als een aanvullend geheel getal-waarde-argument dat voorafgaat aan het argument dat moet worden geformatteerd.

stekenreeks

Other episodes