为什么使用%c进行格式化而不是%d [重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么使用%c进行格式化而不是%d [重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

这是用于在不使用任何运算符的情况下查找两个数字的总和的代码,这里为什么使用%c而不是%d?与%d相比,%c的特征是什么?

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

int main()
{
    printf("Sum = %d", add(3, 4));
    return 0;
}
答案

请注意两件事:

printf("%*c",x,' ')指定用于打印x' '宽度

printf()返回字符数。

所以

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

返回打印的总字符数 -

指定打印' '的宽度x +宽度指定打印' '这是y相当于返回x+y

另一答案

这是利用printf的返回值。分别是x-1空间(' ')然后再空间(如你指定的那样)和y-1空白然后再打印1个空格。然后返回写入的字符总数。这就是总和的方式。

我只记得这条规则

printf("%*c",X,C) prints the char C in a field of size X

所有这些行为都在C11标准中进行了解释。

从标准 §7.21.6.1p4

可选的最小字段宽度。如果转换后的值的字符数少于字段宽度,则在字段宽度上用左侧(或右侧,如果左侧调整标志,稍后描述)填充空格(默认情况下)。字段宽度采用星号*(稍后描述)或非负十进制整数的形式。

并在同一节 §7.21.6.1p5

如上所述,字段宽度或精度或两者可以用星号表示。在这种情况下,int参数提供字段宽度或精度

最后§7.21.6.1.p14

fprintf函数返回传输的字符数,如果发生输出或编码错误,则返回负值。

为什么%c而不是%d

人们可以争辩说,这是因为我们不打算打印这些数字或任何东西 - 这只是为了print x的东西和y数量的东西,以便我们得到x+y的rturn值。你可以尝试这个,这个也可以工作,但你会看到一些数字在屏幕上有如此大的字段witdh。试试这个

 return printf("%*d%*d",  x, x,  y, y);

如果x = 10y=2那么它将是

| | | | | | | | |1|0| |2|
 1 2 3 4 5 6 7 8 9 10  
                      11 12

That's how 12 characters are printed.

以上是关于为什么使用%c进行格式化而不是%d [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Spark:使用 reduceByKey 而不是 groupByKey 和 mapByValues

使用标题而不是重复

ADD和COPY Dockerfile指令有什么区别? [重复]

按列而不是行存储矩阵[重复]

使用 Task.WaitAll 方法而不是 await 关键字[重复]

C# .Net 如何使用 %20 而不是 + [重复] 对 URL 空间进行编码