2014-09-03 72 views
1

我有一個數組(readingreg [4]),它用十六進制數字填充。我的目標是將數據類型轉換爲字符串。我看過一些建議,似乎sprintf是要走的路。sprintf沒有給出預期值

這是我的嘗試:

sprintf(server0, "0x%02X", readingreg[0]); 
printf("This is element 0: %s\n", server0); 

sprintf(server1, "0x%02X", readingreg[1]); 
printf("This is element 1: %s\n", server1); 

sprintf(server2, "0x%02X", readingreg[2]); 
printf("This is element 2: %s\n", server2); 

sprintf(server3, "0x%02X", readingreg[3]); 
printf("This is element 3: %s\n", server3); 


printf("This is element 0: %s\n", server0); 
printf("This is element 1: %s\n", server1); 
printf("This is element 2: %s\n", server2); 
printf("This is element 3: %s\n", server3); 

這裏是我的輸出:

This is element 0: 0x4A 
This is element 1: 0xAA 
This is element 2: 0xAA 
This is element 3: 0xA0 
This is element 0: 0 
This is element 1: A0 
This is element 2: xA0 
This is element 3: 0xA0 

在這一點上,我是在什麼樣的sprintf爲我做了很困惑。我的預期輸出是server0 - server4都保留其字符串值。任何想法爲什麼這是發生?

這裏是程序的簡化版本:

readingreg[0] = 4A; 
readingreg[1] = AA; 
readingreg[2] = AA; 
readingreg[3] = A0; 
char server0[1]; 
char server1[1]; 
char server2[1]; 
char server3[1]; 

完整的程序是超過1000行代碼所以我提供應足以編譯和運行。

+1

server0-3如何初始化?看起來像指向堆棧分配單個字符而不是緩衝區...? – 2014-09-03 20:45:00

+0

'serverx'變量聲明是問題的關鍵。不要將它們排除在您發佈的代碼之外。事實上,發佈一個完整的程序會如此困難,以至於我們所需要做的就是複製/粘貼到我們的代碼編輯器中並運行它? – PaulMcKenzie 2014-09-03 20:47:05

+0

請發佈一個[SSCCE](http://sscce.org),可以按原樣進行復制/粘貼和編譯。 – 2014-09-03 20:54:05

回答

1

當你這樣做:

char server0[1]; 
sprintf(server0, "0x%02X", readingreg[0]); 

你正試圖把5個字符(別忘了尾隨 '\ 0')爲1點的字符緩衝區。這導致發生在觀測輸出中的未定義行爲。

你應該做的(至少)是使字符緩衝區足夠大,可以存儲任何你把它:

char server0[8]; 
sprintf(server0, "0x%02X", readingreg[0]); 

更好的解決方案是使陣列大使用snprintf()或類似的功能來確保您不會溢出字符緩衝區:

char server0[8]; 
snprintf (server0, sizeof(server0)/sizeof(server0[0]), "0x%02X", readingreg[0]); 
+0

如果僅使用'sprintf',不僅應該緩衝區「足夠大」,但大於預期。太多的程序員偷工減料,並試圖預測,直到確切的字節,他們的緩衝區有多大。這幾乎總是導致內存覆蓋。 – PaulMcKenzie 2014-09-03 21:25:15

+0

好吧我剛剛嘗試過snprintf()並使用上面演示的語法。當我做%s的server0 [0]的printf時,控制檯打印垃圾。我期待server0 [0] ='4'和server0 [1] ='A' – KS7X 2014-09-03 22:08:00

+0

不要做'printf(「%s」,server0 [0]);'因爲這是UB。你想要做'printf(「%s」,server0);'。 – uesp 2014-09-04 00:52:47

相關問題