2017-06-04 102 views
-2

here的答案后,我想看看snprintf使用多少个字节。下面的代码snprintf如何对齐字节

#include "stdio.h" 

int main() { 
    printf("%d\n", snprintf(NULL, 0, "%d:%llx:%d:%llx:%llx:%llx", 0, 0, 0, 0, 0, 0)); 
    printf("%d\n", snprintf(NULL, 0, "%d:%llx:%d:%llx:%llx:", 0, 0, 0, 0, 0)); 
    printf("%d\n", snprintf(NULL, 0, "%llx", 0)); 
    return 0; 
} 

返回

22 
10 
1 

我不知道如何在印刷可以使用12个字节,如果其单独使用,同时它仅使用1个字节的其他数据的端部的%LLX。 snprintf能做任何字节对齐吗?

+1

@Stargateur UB是U. –

+0

@DavidSchwartz事实上,没关系,我总是忘了是c不推断可变参数函数类型。 – Stargateur

+0

未定义的行为,schmundefined schmehaviour。 –

回答

3

您的代码有一个错误。 %llx格式说明符仅适用于long long s。尝试:

#include "stdio.h" 

int main() { 
    printf("%d\n", snprintf(NULL, 0, "%d:%llx:%d:%llx:%llx:%llx", 0, 0LL, 0LL, 0LL, 0LL, 0LL)); 
    printf("%d\n", snprintf(NULL, 0, "%d:%llx:%d:%llx:%llx:", 0, 0LL, 0LL, 0LL, 0LL)); 
    printf("%d\n", snprintf(NULL, 0, "%llx", 0LL)); 
    return 0; 
} 
+2

技术上'无符号long long',所以它应该是'0ull'。 – melpomene

+0

如果我们没有ull,C怎么编译它?它认为这是一个未定义的代码? –