2

语句中的宽度有什么用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

4

6 回答 6

4

A)这对 printf 来说是一件非常疯狂的事情。但是既然你问...

B)%*c表示接受 printf 的下两个参数,并将它们解释为宽度和字符。在指定宽度的字段中打印该字符。在这种情况下,打印一个x包含字符的域宽\ry和相同\r。Printf 返回打印的字符总数,在本例中为x+y.

所以输出实际上是x-1空格,一个\r字符,y-1空格,另一个\r字符(或者是字符左对齐?),然后是Sum = 7.

于 2012-07-23T05:28:05.000 回答
3

printf返回输出的字符数。%*c表示打印一个字符并填充到参数指定的宽度。所以printf("%*c", 3, '\r')意味着在它之前打印一个带有 2 个空格的回车。printf("%*c%*c", n, '\r', m, '\r')因此打印n+m字符 - 即n- 1 个空格来填充第一个\rm- 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.

于 2012-07-23T05:29:43.260 回答
1

如果成功printf返回打印的字符数。因此,您的printf调用正在打印函数中main 打印的字符数,因为这是返回的内容。printfaddadd

于 2012-07-23T05:25:56.343 回答
1

查阅任何手册显示printf返回打印的字符数,不包括空终止符。%*c接受两个参数,第一个是字段宽度(因此分别为 3 和 4),第二个是实际打印的字符。在这种情况下,该字符是一个回车符 ( \r),您可能在终端上看不到它。由于这两个字符是用填充打印的,所以打印一个长度为 7 的字符串,并返回 7。

由于您无法分辨空格和回车符,因此看起来根本没有打印任何内容-尝试将输出通过管道传输到文件hexdump中,或者。

于 2012-07-23T05:29:13.207 回答
0

printf 返回打印的字符数。在这种情况下,您通过指定 x 和 y 作为输出长度来打印 7 个字符。如果将 return 语句更改为:

return printf("%*c%*c\n",  x, '\r',  y, '\r'); 

输出将为 8,因为还打印了一个新行。

于 2012-07-23T05:26:51.550 回答
0

鉴于您的函数名称是 add,我非常怀疑这是您的意图。

printf() 返回打印的字符数,在这种情况下显然是 7 个字符。然后,您将返回 printf() 返回的值并打印它。

似乎是一件很奇怪的事情。你期待什么?

于 2012-07-23T05:27:42.017 回答