printf中的“%。* s”是什么意思?

时间:2011-10-26 05:54:02

标签: c printf

我有一个代码片段,其中有一个

printf("%.*s\n")

%.*s是什么意思?

4 个答案:

答案 0 :(得分:96)

您可以使用星号(*)将宽度说明符/精度传递给printf(),而不是将其硬编码为格式字符串,即。

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

答案 1 :(得分:12)

我不认为上面的代码是正确的,但是(根据printf()的描述).*表示

  

宽度未在格式字符串中指定,但作为必须格式化的参数前面的附加整数值参数。'

所以它是一个以可通过的宽度作为参数的字符串。

答案 2 :(得分:11)

更详细here

  

指定最小字段宽度的整数值或*。如果需要,结果将填充空格字符(默认情况下),右对齐时填充左侧,如果左对齐则填充右侧。在使用*的情况下,宽度由int类型的附加参数指定。如果参数的值为负,则会产生指定的 - 标志和正字段宽度。 (注意:这是最小宽度:永远不会截断该值。)

     

.后跟整数或*,或两者都不指定精度   转换。在使用*的情况下,精度为   由int类型的附加参数指定。如果是这个值   论证是否定的,它被忽略了。如果既不是数字也不是*   使用时,精度为零。请参阅下表以获取确切的信息   精度的影响。

因此,如果我们尝试两种转换规范

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

我们得到输出:

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

答案 3 :(得分:10)

请参阅:http://www.cplusplus.com/reference/clibrary/cstdio/printf/

  

.*未在格式字符串中指定精度,但作为必须格式化的参数前面的附加整数值参数。

     

s字符串