c语言中%d和%* d之间有什么区别?

时间:2012-03-30 04:31:42

标签: c integer

什么是%*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 

4 个答案:

答案 0 :(得分:17)

%*d中的printf允许您使用变量来控制字段宽度,如下所示:

int wid = 4;
printf ("%*d\n", wid, 42);

会给你:

..42

(每个.个字符都是空格)。 *消耗一个参数widd消费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字符将在实际输出之前被串联