printf("%*.*s",int,int,char *) 在 c 中是什么意思?

What does printf("%*.*s",int,int,char *) mean in c?

我得到了一个代码片段,其中有一个语句

printf("%*.*s");

%*.*s 是什么意思?

密码是

char *c="**********";
int i,n=4;
for(i=1;i<=n;i++)
{
printf("%*.*s\n",i,i,c);
}

输出为:

*
**
***
****

阅读 printf 的规范:

%[flags][width][.precision][length]specifier

s String of characters

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

对于字符串,宽度是要打印的最小字符数(可以添加填充)。

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

对于字符串,精度是要打印的最大字符数。

您的程序没有传递必需的可选参数(witdh、精度、要打印的字符串)。行为将是不确定的(可能是崩溃)。

首先,首先让我澄清一下,此处格式字符串中的 * 不是用于打印 * 字符本身。它们在这种情况下确实具有特殊含义。


在你的情况下,

 printf("%*.*s");

第一个*字段宽度,第二个*(准确的说是.*)表示精度.

两个 * 都需要一个 int 参数来提供各自的值。

引用标准,

As noted above, a field width, or precision, or both, may be indicated by an asterisk. In this case, an int argument supplies the field width or precision. The arguments specifying field width, or precision, or both, shall appear (in that order) before the argument (if any) to be converted. A negative field width argument is taken as a - flag followed by a positive field width. A negative precision argument is taken as if the precision were omitted.

因此,出现转换说明符的通用形式是

 %[flags]<field width><precision><length modifier>[conversion specifier character]

请注意 <> 中的所有元素都是可选的,只有 [flags][conversion specifier character] 是必需的。也就是说,要求说

Zero or more flags

因此,本质上使[flags]也成为可选的。

请参阅 C11 标准,章节 §7.21.6.1 了解更多信息。

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

printf("%.*s\n", 20, "rabi");

您需要为此语句传递 3 个参数作为 printf("%*.*s",a,b,str);,其中 ab 是整数,str 是字符串。

它打印出 a 个字符,str 的前 b 个字符作为输出的最后 b 个字符。前 b-a 个字符将是 space(' ').