【问题标题】: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);
}

输出是:

*
**
***
****

【问题讨论】:

  • 这意味着在formatting chart for printf() 上的一些时间会很值得。在这种情况下,这也意味着格式错误的 printf 调用,因为您在调用中没有为该格式说明符提供任何必需的参数。
  • 标志、宽度、.precision 和修饰符(按此顺序)是可选的 在您的情况下:宽度:* = 宽度未在格式字符串中指定,而是作为前面的附加整数值参数必须格式化的参数。 .precision: .* = 精度未在格式字符串中指定,而是作为必须格式化的参数之前的附加整数值参数。说明符:s = char* 参考:cplusplus.com/reference/cstdio/printf

标签: 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]
    

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

    零个或多个标志

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

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

    【讨论】:

      【解决方案3】:

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

      它打印出a 的字符数,其中str 的第一个b 字符作为输出的最后一个b 字符。第一个b-a 字符将是空格(' ')。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-05-05
          • 2018-11-08
          • 2020-06-03
          • 1970-01-01
          • 2011-03-02
          • 1970-01-01
          相关资源
          最近更新 更多