“printf”中的“%*c%*c”是什么?

7

当我在 printf 中使用 %*c%*c 时,它需要4个值,并打印出4和5的和。我找不到这样做的有效原因。

在研究时,我发现 %*c 表示宽度。但是对于下面的例子,宽度是什么,为什么会得到和呢?

printf("%*c%*c", 4, ' ', 5, ' ');

Ideone链接

代码:

#include <stdio.h>

int add(int x, int y)
{
    return printf("%*c%*c",x,' ', y,' ');
}

int main()
{
    printf("%d",add(4,5));
    return 0;
}

请在您的帖子中添加完整的示例代码以及输出 - 在这种情况下,这对于答案非常重要! - Jongware
1
你可能想阅读一下关于printf(以及相关函数)的参考资料:http://en.cppreference.com/w/c/io/fprintf。 - Some programmer dude
哦,而你展示的printf调用所做的只是打印9个空格。 - Some programmer dude
这可能会有所帮助 https://dev59.com/lYvda4cB1Zd3GeqPaozE#30607107 - mathematician1975
1
啊,现在有了编辑,就清晰多了。如果你之前阅读我提供的参考链接,特别是关于 printf 返回值 的部分,答案就会很明显了。 - Some programmer dude
3个回答

7

printf返回打印的字符数。

printf("%*c", N, C);打印N-1个空格,然后是字符C。

更一般地说,printf打印N-length_of_text个空格(如果该数字为> 0,则为零个空格),然后是文本。对于数字也是一样。

因此

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

打印一个以x为前缀的空格,减去空格长度(x-1),然后对y执行相同的操作。这样在你的情况下会有4+5个空格。然后printf返回打印的字符总数,即9。
printf("%d",add(4,5));

这个printf打印了由add()函数返回的整数9。

默认情况下,printf是右对齐的(文本前有空格)。要使其左对齐,可以采取以下任一方法:

  • 给定一个负数N,或者
  • *之前添加-,例如%-*s,或者
  • 静态版本也可以使用,例如%-12s%-6d

1
不,printf("%*c",N,C)会在大小为N的字段中打印字符C。 - Jean-Baptiste Yunès
错别字已经修正。谢谢。 - Déjà vu

5

printf("%*c%*c", 4, ' ', 5, ' ');会在长度为4的空间中打印一个空格,紧接着在长度为5的空间中再打印一个空格。因此一共打印出9个字符。

在您发布的代码中,该函数返回printf的结果,即打印出的字符数,因此为9。在主函数中,您打印了这个数字9。


1

一切都如预期。根据手册所述:

格式
(可选). 后跟整数或*,或不跟任何内容以指定转换的精度。如果使用了*,则转换的精度由另一个类型为int的附加参数指定。 如果该参数的值为负,则忽略它。 如果既没有数字也没有*,则将精度视为零。有关精度的确切效果,请参见下表。

返回值
1-2)如果成功,则写入字符的数量;如果发生错误,则为负值。

因此,在您的情况下:

int add(int x, int y)
{
    return printf("%*c%*c",x,' ', y,' ');
    //              ^ x is for the first *, y for the second *
}

作为结果,写入的空间数量(包括精度)为x + y,这是返回值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接