2016-04-03 15 views
1

2x24bit tamsayıyı sprintf aracılığıyla sprintf aracılığıyla dönüştüren bir programım var ve bunları 58 bit bir sayıyı temsil eden bir dizeye koyun. Programı: 1FFFFF2FFFFF ama çıkışı: her şey yolunda 1FFFFF2FFFFF2FFFFF ben kısaltarak res_allres_all[6] içinprintf/sprintf delilik (spontan birleştirme)

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

Belki res_all çıkış yüzden 6 + 6 = 12 karakter res_h+res_l olduğunu düşünüyorum.

Ancak bir 6 karakter dizesi 18 karaktere nasıl yazdırılabilir?

+3

'res_all'da bir nullchar terminator, başarı şansınızı artırabilir * önemli ölçüde *. Bu ve tamponlarınızın düzgün boyutlandırılması. – WhozCraig

+2

@WhozCraig ne dedi. Alternatif olarak, açık bir şekilde kesin olarak belirterek boş sonlandırılmayan bir char arabellek yazdırabilirsiniz: printf ("%. 12s", res_all); "(null sonlandırılmış dizenin yapılması) birçok standart işlevle kullanılmasına izin verir. Yani, bu daha iyi bir yaklaşım.) –

cevap

2

Sonlandırmanız gerekiyor ('\0') res_all. printf sadece boş sonlandırılmış dizeler üzerinde deterministik olarak çalışır. Sanırım şanslısınız ve res_all sadece sıfırdan sonlandırılmış olan res_l'dan önce belleğe yerleştiriliyor. Bir yerlerde yabani otlarda bile kolayca yok olabilirdin.

+0

... ve tam olarak ne anlamı var? – Pemdas

+0

Cevabımın bu şekilde nasıl yorumlanabileceğini görebiliyordum. Bunu ima etmek istemedim '/ 0' == null. Sadece dizgeyi sonlandırmanız gerektiği anlamına gelir ve '/ 0' boş sonlandırıcıyı nasıl belirttiğinizdir. – Pemdas

+0

Blah ... evet demek istediğim bu ... Disleksi kesmek zorundayım. – Pemdas

İlgili konular