What does "%.*s" mean in printf?

CPrintfFormat Specifiers

C Problem Overview


I got a code snippet in which there is a

printf("%.*s\n")

what does the %.*s mean?

C Solutions


Solution 1 - C

You can use an asterisk (*) to pass the width specifier/precision to printf(), rather than hard coding it into the format string, i.e.

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

Solution 2 - C

More detailed here.

> integer value or * that specifies minimum field width. The result is padded with space characters (by default), if required, on the left when right-justified, or on the right if left-justified. In the case when * is used, the width is specified by an additional argument of type int. If the value of the argument is negative, it results with the - flag specified and positive field width. (Note: This is the minimum width: The value is never truncated.)

> . followed by integer number or *, or neither that specifies precision > of the conversion. In the case when * is used, the precision is > specified by an additional argument of type int. If the value of this > argument is negative, it is ignored. If neither a number nor * is > used, the precision is taken as zero. See the table below for exact > effects of precision.

So if we try both conversion specification

#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 get the output:

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

Solution 3 - C

I don't think the code above is correct but (according to this description of printf()) the .* means

> The width is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted.'

So it's a string with a passable width as an argument.

Solution 4 - C

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

> .* The precision is not specified in the format string, but as an additional integer value argument preceding the argument that has to be formatted. > > s String of characters

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionStevenWangView Question on Stackoverflow
Solution 1 - CAusCBlokeView Answer on Stackoverflow
Solution 2 - COndrejView Answer on Stackoverflow
Solution 3 - CrerunView Answer on Stackoverflow
Solution 4 - CJoshView Answer on Stackoverflow