【问题标题】:What does printf("%*.*s",int,int,char *) mean in c? [duplicate]printf("%*.*s",int,int,char *) 在c中是什么意思? [复制]
【发布时间】:2015-06-19 09:07:35
【问题描述】:
我得到了一个代码 sn-p,其中有一个语句
printf("%*.*s");
%*.*s 是什么意思?
代码是
char *c="**********";
int i,n=4;
for(i=1;i<=n;i++)
{
printf("%*.*s\n",i,i,c);
}
输出是:
*
**
***
****
【问题讨论】:
标签:
c
printf
format-specifiers
【解决方案1】:
阅读printf的规范:
%[flags][width][.precision][length]specifier
s 字符串
* 宽度没有在格式字符串中指定,而是作为必须格式化的参数前面的附加整数值参数。
对于字符串,宽度是要打印的最小字符数(可以添加填充)。
.* 精度未在格式字符串中指定,而是作为必须格式化的参数之前的附加整数值参数。
对于字符串,精度是要打印的最大字符数。
您的程序没有传递所需的可选参数(witdh、precision、要打印的字符串)。行为将是未定义的(可能会崩溃)。
【解决方案2】:
首先,让我澄清一下,此处格式字符串中的*s 不是用于打印* 字符本身。在这种情况下,它们确实具有特殊的含义。
在你的情况下,
printf("%*.*s");
第一个* 是字段宽度,第二个*(准确地说是.*)表示精度。
*s 都需要一个 int 参数来提供各自的值。
引用标准,
如上所述,字段宽度或精度或两者都可以用星号表示。在这种情况下,int 参数提供字段宽度或精度。指定字段宽度或精度或两者的参数应(按该顺序)出现在要转换的参数(如果有)之前。负字段宽度参数被视为 - 标志,后跟正字段宽度。采用负精度参数,就好像省略了精度一样。
因此,转换说明符出现的通用形式是
%[flags]<field width><precision><length modifier>[conversion specifier character]
请注意<> 中的所有元素都是可选的,只有[flags] 和[conversion specifier character] 是必需的。也就是说,要求说
零个或多个标志
因此,基本上使[flags] 也成为可选的。
请参阅C11 标准,第 7.21.6.1 章了解更多信息。
【解决方案3】:
您需要将此语句的 3 个参数作为 printf("%*.*s",a,b,str); 传递,其中 a 和 b 是整数,str 是字符串。
它打印出a 的字符数,其中str 的第一个b 字符作为输出的最后一个b 字符。第一个b-a 字符将是空格(' ')。
【解决方案4】:
.* 精度未在格式字符串中指定,而是作为必须格式化的参数之前的附加整数值参数。
printf("%.*s\n", 20, "rabi");