2017-05-26 166 views
4

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

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

有没有办法做到这一点?

+2

https://stackoverflow.com/questions/19327441/gcc-dollar-sign-in-printf-format-string – Barmar

+2

在ISO C中,你需要使用一个变量(或可变参数列表)来保存值,然后在参数列表中指定两次 –

+0

是否存在实际需要或者这是理论问题? – i486

回答

8

如果你在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也必须在格式字符串的某处指定为 。

+0

非常感谢。将接受系统让我的时间。 – DEADBEEF

+3

每个'man 3 printf'只需注释一下:“* C99标准不包含使用'$'的样式,该样式来自Single UNIX Specification。*” –

+2

^换句话说,这是一个POSIX扩展 –