【问题标题】:How does this printf trick works这个 printf 技巧是如何工作的
【发布时间】:2018-12-14 12:11:34
【问题描述】:

取自here

printf("%d", printf("%*s%*s",a,"\r",b,"\r") );

将打印 a+b 的结果。

它到底是如何工作的?

【问题讨论】:

标签: c printf


【解决方案1】:

第二个(内部)printf 所做的是打印与a 一样多的字符,然后打印与b 一样多的字符。 printf 返回打印的字符数,即 ab 的总和。

现在让我们更深入一点,printf("%*s", a, "\r") 将打印一个宽度通过参数指定的字符串(在本例中为a)——这就是星号的作用。默认情况下,字符串用空格填充。因此,您将获得a - 1 空格,后跟一个回车符。这样做两次:printf("%*s%*s",a,"\r",b,"\r") 将首先打印一个宽度固定为a 值的字符串,然后打印第二个宽度固定为b 值的字符串。

之后,外部printf 将打印与内部printf 打印的字符数相对应的数字,但我们已经知道那会是什么,不是吗?

注意:由于左填充只能添加,永远不会删除字符,a = 0b = 0 的代码实际上是错误的(当然是否定的)

【讨论】:

    【解决方案2】:

    由于printf 在输出中返回字符数,而%*s 说明符实际上读取两个参数(一个整数和一个字符)并打印缩进的字符(因此在它之前打印 n-1 个空格),本质上是内层printf 印有a+b\rs,外层printf 印有那个数字。

    【讨论】:

    • %*s 接受一个数字和一个字符串,而不是一个字符,并通过在左侧填充空格来格式化字符串,使其至少与数字指定的宽度相同。
    猜你喜欢
    • 1970-01-01
    • 2012-05-10
    • 1970-01-01
    • 2011-03-16
    • 2016-03-01
    • 2011-02-14
    • 2011-02-05
    • 2013-04-23
    • 2012-02-18
    相关资源
    最近更新 更多