145

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

printf("%.*s\n")

是什么%.*s意思?

4

4 回答 4

147

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

void f(const char *str, int str_len)
{
  printf("%.*s\n", str_len, str);
}
于 2011-10-26T05:59:50.743 回答
37

更详细的在这里

整数值或*指定最小字段宽度。如果需要,结果会用空格字符(默认情况下)填充,右对齐时在左侧,如果左对齐,则在右侧。在使用 * 的情况下,宽度由 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|
于 2018-03-30T19:19:34.037 回答
12

我不认为上面的代码是正确的,但(根据这个描述printf().*手段

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

所以它是一个具有可传递宽度的字符串作为参数。

于 2011-10-26T06:00:06.143 回答
10

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

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

s 字符串

于 2011-10-26T06:00:08.027 回答