在printf()中使用宽度

时间:2012-07-23 05:21:15

标签: c++ c printf

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;
}

输出

  

Sum = 7

6 个答案:

答案 0 :(得分:4)

A)这与printf有关。但既然你问过......

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

所以输出实际上是x-1个空格,\r个字符,y-1个空格,另一个\r个字符(或者是左对齐的字符?),后跟{ {1}}。

答案 1 :(得分:3)

printf返回输出的字符数。 %*c表示将字符和填充打印到参数指定的宽度。所以printf("%*c", 3, '\r')意味着打印一个前面有2个空格的回车。 printf("%*c%*c", n, '\r', m, '\r')因此会打印n + m个字符 - n - 1个空格来填充第一个\rm - 1个空格来填充第二个\r,两个回车。这就是它返回7的原因。

回车会将您带回到行的开头,因此在打印完n + m个字符后,下一个打印的内容将显示在行的开头。这意味着"Sum = "会覆盖第一个printf的输出。

答案 2 :(得分:1)

如果成功printf返回打印的字符数。因此,printf中的main来电显示了printf函数中add打印的字符数,因为这是add返回的内容。< / p>

答案 3 :(得分:1)

咨询任何manual表明printf返回打印的字符数,不包括空终止符。 %*c采用两个参数,第一个是字段宽度(因此分别为3和4),第二个是打印的实际字符。在这种情况下,字符是回车符(\r),您可能无法在终端上看到。由于两个字符都使用填充打印,因此打印长度为7的字符串,并返回7。

由于你无法分辨空格和回车,看起来根本没有打印 - 尝试将输出汇总到一个文件或hexdump

答案 4 :(得分:0)

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

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

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

答案 5 :(得分:0)

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

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

似乎很奇怪。你有什么期待?