C语言中printf的标志和修饰符

时间:2017-01-21 11:21:20

标签: c printf

我的任务是使用其大部分功能(在C中)重新编码printf。但是,在进行一些测试时,我发现了一个问题:当用户放置多于1个修饰符时,我不明白标准函数的行为(允许的修饰符是h,hh,l,ll,z和j)。 /> 例如:

printf("%hhld", 128) results in 128 printed out;  
printf("%lhhd", 128) results in 128 printed out;  
printf("%lhhd", 9223372036854775807) shows 9223372036854775807;  
printf("%lhhd", 9223372036854775808) shows -9223372036854775808;  
printf("%hhld", 9223372036854775807) shows 9223372036854775807;  
printf("%hhld", 9223372036854775808) shows -9223372036854775808; 

将选择什么修饰符以及printf如何选择它?为什么在这种情况下总会忽略......

另一个问题是我的printf是否应该以随机顺序使用flags和modifier?因为在wiki中,文章提到了某个顺序:

  
    

%[参数] [标志] [宽度] [。精度] [长度]类型

  

1 个答案:

答案 0 :(得分:4)

这是未定义的行为,请阅读文档。

基本上传递一个参数,该参数的类型与说明符所期望的类型不同,被标准认为是未定义的行为。

您也在混合不兼容的说明符,再次“只阅读文档”,如果您想要完全理解printf(3)的行为,这是一个很好的文档。