2016-04-03 8 views
1

У меня есть программа, которая принимает 2x24bit integer, преобразует их в strings через sprintf и складывает их в строку, представляющую 58-битное число. Программа:printf/sprintf madness (spontanous concatenation)

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); 

Вы, возможно, думаете, что выход на res_all является res_h+res_l которые 6 + 6 = 12 символов так: 1FFFFF2FFFFF но вывод: 1FFFFF2FFFFF2FFFFF если сократить res_all к res_all[6] все в порядке.

Но как можно напечатать 6-значную строку до 18 символов?

+3

Терминатор nullchar в 'res_all' может улучшить ваши шансы на успех * значительно *. Это и правильная калибровка ваших буферов. – WhozCraig

+2

Что сказал @WhozCraig. В качестве альтернативы вы можете напечатать буфер символов, который не завершен нулем, явно указывая точность: 'printf («% .12s », res_all);' (При завершении нулевой строки он будет использоваться со многими стандартными функциями , так что это лучший подход.) –

ответ

2

У вас есть значение null terminate ('\0') res_all. printf работают детерминистически только на нулевых концах строк. Я предполагаю, что вам повезло, и res_all просто находится в памяти непосредственно перед res_l, который, случается, заканчивается на нуль. Вы могли бы так же легко сорваться в сорняках.

+0

... и ваша точка в том, что именно? – Pemdas

+0

Я мог видеть, как мой ответ может быть истолкован таким образом. Я не имел в виду, что '/ 0' == null. Я просто хотел, чтобы вам нужно было обнулить строку, а «/ 0» - это указать нулевой терминатор. – Pemdas

+0

Бла ... да, это то, что я имел в виду ... У меня есть дислексия слэш. – Pemdas