【问题标题】:Set variable text column width in printf在 printf 中设置可变文本列宽
【发布时间】:2011-10-29 16:07:27
【问题描述】:

为了确定 C 语言中列的大小,我们使用%<number>d。 例如,我可以输入%3d,它会给我一个宽度=3 的列。 我的问题是% 之后的数字是我收到的变量,所以我需要%xd 之类的东西(其中x 是我之前在程序中收到的整数变量)。 但它不起作用。

还有其他方法吗?

【问题讨论】:

  • 一般来说,您应该复制粘贴您收到的确切错误消息,而不是“不工作”。
  • @luserdroog printf 失败时没有错误消息。它只是默默地给出不正确的输出。
  • 这和八岁的问题有关吗?你得到什么输出,你期待什么?电话是什么样的?

标签: c size printf


【解决方案1】:

你可以这样做:

printf("%*d", width, value);

来自李的评论:
您也可以使用 * 来表示精度:

printf("%*.*f", width, precision, value);

请注意,widthprecision 必须具有 printf 所期望的 printf 类型 * 参数,类型 size_t 是不合适的,因为它可能在目标上具有不同的大小和表示平台。

【讨论】:

  • @SouravKannanthaB:不,这不适用于scanf* 表示抑制分配,并且没有为此转换规范提供指针参数。无法将数字指定为参数,但您可以使用snprintf 组成格式字符串作为解决方法。 scanf_s 来自可选且有争议的附件 K 试图解决相关问题,但规范不足以简单使用。
【解决方案2】:

为了完整起见,想提一下,对于printf() 的 POSIX 兼容版本,您还可以将实际字段宽度(或精度)值放在参数列表中的其他位置,并使用从 1 开始的参数编号来引用它后跟一个美元符号:

字段宽度或精度或两者都可以用星号“*”或星号后跟一个或多个十进制数字和一个“$”来表示,而不是数字字符串。在这种情况下,一个 int 参数提供字段宽度或精度。负场宽被视为左调整标志,后跟正场宽;负精度被视为丢失。如果单个格式指令混合了位置 (nn$) 和非位置参数,则结果未定义。

例如,printf ( "%1$*d", width, value );

【讨论】:

  • 您的示例不适合该语言。应该是"%*1$d"
  • 此外,您应该通过n$ 指定这两个参数,例如:printf("%2$*1$d", width, value);
猜你喜欢
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多