【问题标题】:Using %. in printf使用 %。在 printf 中
【发布时间】:2014-01-23 22:24:07
【问题描述】:

我在C++ 中遇到过这行代码。我不确定我是否理解语法。两个变量被传递给printf,但只显示一个数字。

  printf("Value of bar is: [%.*s]\n", tok->len, tok->ptr);

【问题讨论】:

  • 不是问题,但printf 确实是 C,不应该在 C++ 中使用。
  • @StefanoSanfilippo 如果你是 C++ 的粉丝而不是 ,你会用什么。
  • @Brandin:增强格式。

标签: c++ c printf


【解决方案1】:

格式字符串

%.*s

使用两个参数。第一个指定精度,第二个是要打印的值。

所以假设tok->len 的值是3。那么你问题中的代码就相当于:

printf("Value of bar is: [%.3s]\n", tok->ptr);

从良好的文档来源了解更多信息,例如:http://en.cppreference.com/w/cpp/io/c/fprintf

至于在这种情况下精度意味着什么,上面的文档来源说:

精度指定要写入的最大字节数。

这种写法有点草率。它应该说字符而不是字节。

【讨论】:

  • 有趣的是,“最大字节数”是 N1570 使用的措辞。在这里使用“字节”似乎很重要,因为这意味着转换说明符 sl 的行为方式非常奇怪。
【解决方案2】:

来自The flag characters段落下的printf手册页:

精度

可选精度,以句点 ('.') 的形式 后跟一个 可选的十进制数字字符串。 而不是十进制数字字符串一 可以写成 "*" 或 "*m$" (对于一些十进制整数 m)来指定 精度在下一个参数或第 m 个参数中给出, 分别是 int 类型。如果精度给出为 只是'.',或者精度为负,则精度为 零。这给出了 d、i、o、 u、x 和 X 转换后出现的位数 a、A、e、E、f 和 F 转换的基数字符,最大值 g 和 G 转换的有效位数,或 最大值 要从 s 和 S 的字符串中打印的字符数 转化率。

强调我的。

在您的情况下,%.*s 表示下一个参数表示将被解释为要打印的以下字符串参数的最大字符数的精度。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-26
      • 1970-01-01
      • 2016-11-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多