【发布时间】:2018-12-14 12:11:34
【问题描述】:
【问题讨论】:
-
没有重复。虽然可以作为这个问题的提示
-
这是一种混淆,不值得深思。
【问题讨论】:
第二个(内部)printf 所做的是打印与a 一样多的字符,然后打印与b 一样多的字符。 printf 返回打印的字符数,即 a 和 b 的总和。
现在让我们更深入一点,printf("%*s", a, "\r") 将打印一个宽度通过参数指定的字符串(在本例中为a)——这就是星号的作用。默认情况下,字符串用空格填充。因此,您将获得a - 1 空格,后跟一个回车符。这样做两次:printf("%*s%*s",a,"\r",b,"\r") 将首先打印一个宽度固定为a 值的字符串,然后打印第二个宽度固定为b 值的字符串。
之后,外部printf 将打印与内部printf 打印的字符数相对应的数字,但我们已经知道那会是什么,不是吗?
注意:由于左填充只能添加,永远不会删除字符,a = 0 或 b = 0 的代码实际上是错误的(当然是否定的)
【讨论】:
由于printf 在输出中返回字符数,而%*s 说明符实际上读取两个参数(一个整数和一个字符)并打印缩进的字符(因此在它之前打印 n-1 个空格),本质上是内层printf 印有a+b\rs,外层printf 印有那个数字。
【讨论】:
%*s 接受一个数字和一个字符串,而不是一个字符,并通过在左侧填充空格来格式化字符串,使其至少与数字指定的宽度相同。