“% . * s”在 printf 中是什么意思?

我有一段代码片段

printf("%.*s\n")

%.*s是什么意思?

133766 次浏览

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

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

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

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

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

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

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

字符串

更详细的 给你

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

.后面跟着整数数字或 * ,或者既不指定精度也不指定精度 如果使用 * ,则精度为 类型的附加参数指定 参数为负,则忽略该参数 如果使用,则精度为零。请参阅下表以获得精确值 精确度的影响。

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

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