【问题标题】:printf an argument twiceprintf 一个参数两次
【发布时间】:2017-05-26 01:39:29
【问题描述】:

我想将一个额外的参数传递给printf 并打印两次,例如

printf("%s%s","somestring");       // prints somestringsomestring

有什么办法吗?

【问题讨论】:

  • 在 ISO C 中,您需要使用变量(或可变参数列表)来保存值,然后在参数列表中指定两次
  • 是否有实际需要或这是理论上的问题?

标签: c printf


【解决方案1】:

如果您使用的是 Linux 或其他类似 UNIX 的系统,您可以使用 $ 指定参数编号:

printf("%1$s%1$s\n", "hello");

在本例中,1$ 表示“使用第一个参数”。我们还多次使用此语法,因此我们可以多次使用给定参数。

Linux man page for printf 提供了更多详细信息:

参数必须正确对应(在类型提升之后)与 转换说明符。默认情况下,参数按顺序使用 给定,其中每个“*”和每个转换说明符都要求下一个 参数(如果参数数量不足,这是一个错误 给定)。也可以明确指定采用哪个参数,在 每个需要参数的地方,通过写“%m$”而不是 '%' 和 "m$" 而不是 '',其中十进制整数 m 表示 在所需参数的参数列表中的位置,索引 从 1 开始。因此,

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

printf("%2$*1$d", width, num);

是等价的。第二种样式允许重复引用 同样的论点。 C99 标准不包括使用 '$' 的样式, 它来自单一 UNIX 规范。如果样式使用'$' 被使用,它必须在所有转换中使用 参数以及所有宽度和精度参数,但可以混合使用 使用不使用参数的“%%”格式。可能没有 使用 '$' 指定的参数数量的差距;例如,如果 参数 1 和 3 已指定,参数 2 也必须指定 格式字符串中的某处。

【讨论】:

  • 非常感谢。当系统允许我时会接受。
  • 只是对man 3 printf 的注释:“C99 标准不包括使用来自单一 UNIX 规范的 '$' 的样式。
  • ^ 换句话说,这是一个 POSIX 扩展
  • 另外,有什么办法可以让printf("hello%s"); 打印出来hellohello%s,例如打印第 0 个参数? 0$ 不工作。
  • @0xBADC0DE 不,这行不通。格式字符串定义了以下参数是什么。它不能以这种方式引用自己。
猜你喜欢
  • 2012-06-04
  • 2021-01-02
  • 1970-01-01
  • 2012-11-13
  • 2022-01-19
  • 2019-08-02
  • 2017-06-26
  • 2021-08-21
  • 1970-01-01
相关资源
最近更新 更多