2017-06-04 65 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怎麼編譯它?它認爲這是一個未定義的代碼? –