在C语言中,%d和%*d有什么区别?

10

%*d 是什么意思?我知道 %d 用于整数,那么我认为 %*d 也必须只与整数相关吧?它的目的是什么?它是做什么用的呢?

int a=10,b=20;
printf("\n%d%d",a,b);
printf("\n%*d%*d",a,b);

结果是

10 20 
1775 1775 

4
似乎是宽度说明符:http://www.cplusplus.com/reference/clibrary/cstdio/printf/ - Mysticial
2
@Mysticial,你应该把它写成一个答案。 - Ben
@Ben,这只是一个链接 - 这并不算作答案。我太懒了,没有继续展开... - Mysticial
@Ben,显然它确实值得被踩。只需阅读文档,答案就立即可得。 - Carl Norum
2
对于负投票,它可能被证明是合理的,“这个问题没有显示出任何研究努力...”但我倾向于对新手们施加一点压力,不像guga,今天早上我感觉太冷漠了,无法发表反转票:-)。 顺便说一下,最后一个 printf 是未定义行为,因为您应该传递四个参数。 - paxdiablo
显示剩余2条评论
4个回答

19

printf中的%*d可以让你使用变量控制字段宽度,例如:

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

这将给你:

..42
(其中每个 . 字符都代表一个空格)。 * 接受一个参数 wid ,而 d 接受 42 。
您当前的表单,例如:
printf ("%*d %*d\n", a, b);

根据标准,这是未定义行为,因为您应该在格式字符串后面提供四个参数而不是两个(如果您提高警告级别,好的编译器如gcc会告诉您这一点)。根据C11 7.20.6 格式化输入/输出函数:

如果格式不足以提供参数,则其行为未定义。

应该像这样:

printf ("%*d %*d\n", 4, a, 4, b);
你得到奇怪的输出是因为存在未定义行为。这篇优秀的回答展示了当你不遵循规则时会出现哪些问题(以及为什么),特别是在这种情况下。
现在我不认为这是一个对齐问题,因为您对于所有数据类型都使用了int,但是像所有未定义的行为一样,任何事情都有可能发生。

13

当与scanf()函数一起使用时,它表示解析了一个整数,但结果不会存储在任何地方。

当与printf()函数一起使用时,它表示下一个格式参数指定了宽度参数。


5

星号用作printf的参数指示符,表示宽度将作为参数传递。


1
那么为什么它会产生输出1775 1775? - Parag
1
printf是一个可变参数函数,因此在解析格式字符串时,它会查找表示第一个值的宽度的整数、该值本身、第二个值的宽度和第二个值。由于您只传递了2个值,所使用的值是未定义的。尝试使用4个有意义的值并查看结果。 - guga

1
在 "%*d" 中,第一个参数被定义为输出的总宽度,第二个参数被视为普通整数。 以下是程序示例:
int x=6,p=10;
printf("%*d",x,p);
output: "    10"

第一个参数ta传递给*,定义了输出的总宽度...在本例中,宽度被传递为6。因此整个输出的长度将为5。 现在对于数字10,需要两个位置(1和0,总共2个)。因此,在实际输出之前,将连接3个空字符串或'\0'或NULL字符。


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