2016-04-03 9 views
1

Ich habe ein Programm, das 2x24bit Integer konvertiert sie zu strings über sprintf und setzen Sie sie zu einer Zeichenfolge, die eine 58-Bit-Nummer darstellt. Programm:printf/sprintf Wahnsinn (spontane Verkettung)

int buffer_h = 0x001FFFFF; 
int buffer_l = 0x002FFFFF; 
int i,j = 0; 

char res_h[10]; 
char res_l[10]; 
char res_all[12]; 

sprintf(res_h,"%06X",buffer_h); 

sprintf(res_l,"%06X",buffer_l); 

for(i=0;i<6;i++) { 
    res_all[i] = res_h[i]; 
} 

for(i=0;i<6;i++) { 
    res_all[i+6] = res_l[i]; 
} 

printf("%s",res_all); 

Sie denken vielleicht die Ausgabe auf res_allres_h+res_l ist, die 6 + 6 = 12 Zeichen so: 1FFFFF2FFFFF aber die Ausgabe ist: 1FFFFF2FFFFF2FFFFF wenn ich verkürzen res_all-res_all[6] es ist alles in Ordnung.

Aber wie kann eine 6-stellige Zeichenfolge auf 18 Zeichen gedruckt werden?

+3

Ein Nullchar-Terminator in 'res_all' kann Ihre Erfolgschancen * erheblich * verbessern. Das und die richtige Größe Ihrer Puffer. – WhozCraig

+2

Was @WhozCraig sagte. Alternativ können Sie einen Zeichenkettenpuffer, der nicht null-terminiert ist, durch explizite Angabe einer Genauigkeit ausgeben: 'printf ("%. 12s ", res_all);' (Wenn die Zeichenkette auf Null gesetzt wird, kann sie mit vielen Standardfunktionen verwendet werden) Das ist der bessere Ansatz.) –

Antwort

2

Sie müssen null terminieren ('\0') res_all. printf arbeiten nur deterministisch auf nullterminierten Strings. Ich nehme an, Sie haben Glück und res_all passiert zufällig im Speicher direkt vor res_l, die zufällig null terminiert ist. Sie hätten genauso gut irgendwo im Unkraut ausrasten können.

+0

... und was genau ist dein Punkt? – Pemdas

+0

Ich konnte sehen, wie meine Antwort so interpretiert werden könnte. Ich wollte damit nicht '/ 0' == null implizieren. Ich meinte einfach, Sie müssen null die Zeichenfolge beenden und '/ 0' ist, wie Sie den Nullabschluss angeben. – Pemdas

+0

Blah ... ja das ist, was ich meinte ... Ich habe Schrägstrich-Legasthenie. – Pemdas