什么是%*d
?我知道%d
用于integers
,所以我认为%*d
也必须只与整数相关?它的目的是什么?它做了什么?
int a=10,b=20;
printf("\n%d%d",a,b);
printf("\n%*d%*d",a,b);
结果是
10 20
1775 1775
答案 0 :(得分:17)
%*d
中的printf
允许您使用变量来控制字段宽度,如下所示:
int wid = 4;
printf ("%*d\n", wid, 42);
会给你:
..42
(每个.
个字符都是空格)。 *
消耗一个参数wid
,d
消费42
。
您拥有的表单,例如:
printf ("%*d %*d\n", a, b);
是根据标准的未定义行为,因为你应该在格式字符串之后提供四个参数,而不是两个(和gcc
这样的好编译器会告诉你如果你碰到这个提高警告水平)。来自C11 7.20.6 Formatted input/output functions
:
如果格式的参数不足,则行为未定义。
应该是这样的:
printf ("%*d %*d\n", 4, a, 4, b);
你获得奇怪输出的原因是由于未定义的行为。 This excellent answer向您展示了当您不遵守规则时可能出错的原因(以及原因),尤其是与此相关的情况。
现在我不希望这是一个错位问题,因为你对所有数据类型使用int
但是,与所有未定义的行为一样,任何都可能发生。
答案 1 :(得分:10)
当与scanf()函数一起使用时,这意味着解析了一个整数,但结果不存储在任何地方。
当与printf()函数一起使用时,这意味着width参数由下一个format参数指定。
答案 2 :(得分:5)
*用于指示宽度作为printf参数传递
答案 3 :(得分:0)
在“%* d”中,第一个参数定义为输出的总宽度,第二个参数视为普通整数。 用于以下程序
Byte
为*传递的第一个参数ta定义了输出的总宽度...在这种情况下,宽度被传递为6。因此,整个输出的长度将为5。 现在到10,需要两个位置(1和0,总共2个)。因此剩余的5-2 = 3空字符串或'\ 0'或NULL字符将在实际输出之前被串联