%*d
是什么意思?我知道 %d
用于整数,那么我认为 %*d
也必须只与整数相关吧?它的目的是什么?它是做什么用的呢?
int a=10,b=20;
printf("\n%d%d",a,b);
printf("\n%*d%*d",a,b);
结果是
10 20
1775 1775
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
,但是像所有未定义的行为一样,任何事情都有可能发生。
当与scanf()函数一起使用时,它表示解析了一个整数,但结果不会存储在任何地方。
当与printf()函数一起使用时,它表示下一个格式参数指定了宽度参数。
星号用作printf的参数指示符,表示宽度将作为参数传递。
int x=6,p=10;
printf("%*d",x,p);
output: " 10"
第一个参数ta传递给*,定义了输出的总宽度...在本例中,宽度被传递为6。因此整个输出的长度将为5。 现在对于数字10,需要两个位置(1和0,总共2个)。因此,在实际输出之前,将连接3个空字符串或'\0'或NULL字符。
printf
是未定义行为,因为您应该传递四个参数。 - paxdiablo