2017-06-04 1 views
-2

Nach der Antwort von here wollte ich sehen, wie viele Bytes ein snprintf verwendet. Der folgende CodeWie funktioniert das Ausrichten von snprintf-Bytes

#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; 
} 

kehrt

22 
10 
1 

Ich verstehe nicht, wie das% llx am Ende der anderen Daten gedruckt 12 Byte verwenden kann, während es nur 1 Byte verwendet, wenn es allein verwendet wird. Führt snprintf eine Byteausrichtung aus?

+1

@Stargateur UB U. ist –

+0

@DavidSchwartz der Tat egal, habe ich immer vergessen, dass C ableiten, nicht Typ in variadische Funktion. – Stargateur

+0

Undefiniertes Verhalten, schmundefiniert schmehaviour. –

Antwort

3

Ihr Code hat einen Fehler. Der Formatbezeichner %llx ist nur für long long s. Versuchen:

#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

Technisch "unsigned long long", also sollte es "0ull" sein. – melpomene

+0

Wenn wir nicht haben, wie kompiliert es C? Ist es ein undefinierter Code? –