2014-01-20 130 views
0

我正在學習C語言,有些東西我無法弄清楚sscanf。打印到緩衝區時,沒有任何數據正在寫入,並且它們始終以-1失敗。如果你看到第二個printf語句,我可以在屏幕上清晰地查看我的數據,所以我知道它是正確的,但由於某種原因,指針沒有任何內容。sscanf寫入不正確

這是我的代碼片段。

char *v = (char*)&int_value; 
int i; 
for(i=0;i<sizeof(unsigned int);i++) 
{ 
    printf("sscanf success: %d ", sscanf(&v[i], "%02x", &buffer[pos+i])); 
    printf("%02x\n", v[i]); 
} 

謝謝,我只是按字節做字節現在buffer[pos+i] = v[i];

+0

'buffer'是如何定義的?還有'&v [i]'似乎在做錯誤的事情,它會在'i'位置訪問'v'的指針,然後把指針指向那個位置,爲什麼? – nrathaus

+2

函數'sscanf'需要一個實際的字符串作爲第一個參數。 – cnicutar

+0

'buffer'是一個char *。但是如果我確實使用'sscanf(「0f」,「%02x」,&buffer [pos + i])這樣的實際字符串,那麼它會寫得很好。我應該使用什麼函數呢? – enigma99a

回答

0

你假設int值在某種程度上轉換由類型轉換爲ASCII,但它不是這樣的sscanf的將失敗。 sscanf需要有效的C字符串才能在例如char* p = "02";但是當你輸入int時,你會得到數字的實際字節表示 - 例如,在中間可能會有一個0來終止字符串。

E.g.如果你的int值是8,它會在內存中看起來像這樣:00 00 10 00(或者十六進制的00h 08h - 它的外觀取決於你的體系結構)。

+0

我正在嘗試做十進制小端到十六進制並保存到緩衝區。我最好怎麼做到這一點? – enigma99a

+0

你已經按照一定的順序用你的printf輸出了十六進制值,你的操作系統是小的還是大的?如果它是在小端,那麼它只是一個字節複製到緩衝區的問題。如果不是的話,你可以使用聯合'typedef union {unsigned int n; unsigned char b [4]; } uu'然後只是交換字節 –

+0

是的,它可以工作,但我不知道如何獲取數據到緩衝區。感謝您的幫助,也是操作系統是小endian – enigma99a