语句中的宽度有什么用printf()
?为什么下面示例中的输出为 7?
代码
int add(int x, int y)
{
return printf("%*c%*c", x, '\r', y, '\r');
}
int main()
{
printf("Sum = %d", add(3, 4));
return 0;
}
输出
总和 = 7
A)这对 printf 来说是一件非常疯狂的事情。但是既然你问...
B)%*c
表示接受 printf 的下两个参数,并将它们解释为宽度和字符。在指定宽度的字段中打印该字符。在这种情况下,打印一个x
包含字符的域宽\r
。y
和相同\r
。Printf 返回打印的字符总数,在本例中为x+y
.
所以输出实际上是x-1
空格,一个\r
字符,y-1
空格,另一个\r
字符(或者是字符左对齐?),然后是Sum = 7
.
printf
返回输出的字符数。%*c
表示打印一个字符并填充到参数指定的宽度。所以printf("%*c", 3, '\r')
意味着在它之前打印一个带有 2 个空格的回车。printf("%*c%*c", n, '\r', m, '\r')
因此打印n
+m
字符 - 即n
- 1 个空格来填充第一个\r
,m
- 1 个空格来填充第二个\r
,然后两个回车符。这就是它返回 7 的原因。
A carriage return takes you back to the start of the line, so after printing those n
+ m
characters the next thing printed will appear at the start of the line. That means "Sum = "
overwrites the output of the first printf.
如果成功printf返回打印的字符数。因此,您的printf
调用正在打印函数中main
打印的字符数,因为这是返回的内容。printf
add
add
查阅任何手册显示printf
返回打印的字符数,不包括空终止符。%*c
接受两个参数,第一个是字段宽度(因此分别为 3 和 4),第二个是实际打印的字符。在这种情况下,该字符是一个回车符 ( \r
),您可能在终端上看不到它。由于这两个字符是用填充打印的,所以打印一个长度为 7 的字符串,并返回 7。
由于您无法分辨空格和回车符,因此看起来根本没有打印任何内容-尝试将输出通过管道传输到文件hexdump
中,或者。
printf 返回打印的字符数。在这种情况下,您通过指定 x 和 y 作为输出长度来打印 7 个字符。如果将 return 语句更改为:
return printf("%*c%*c\n", x, '\r', y, '\r');
输出将为 8,因为还打印了一个新行。
鉴于您的函数名称是 add,我非常怀疑这是您的意图。
printf() 返回打印的字符数,在这种情况下显然是 7 个字符。然后,您将返回 printf() 返回的值并打印它。
似乎是一件很奇怪的事情。你期待什么?