2016-12-21 71 views
-1

我使用softserial與藍牙調制解調器進行溝通,我用下面的代碼串推到串行:需要幫助處理CHAR串用的printf

char bt_string = "test"; 
bluetooth_println(bt_string); 

我需要能夠更換串

printf(" Error: cmd=%02hX, res=%02hX\n", CMD_SEND_CID, res); 

我曾嘗試下面的代碼

char bt_string; 
sprintf(bt_string, " Error: cmd=%02hX, res=%02hX\n", CMD_SEND_CID, res); 
bluetooth_println(bt_string); 

但它不能輸出nything。我顯然是誤解了一些東西。謝謝你的幫助。

回答

4

您需要爲您的字符串提供一個緩衝區。

char bt_string[256]; // <-- or any size that you are sure will be enough for what you will put in. 

最終,爲了安全,你可以使用snpritf以避免任何緩衝區溢出:

#define MAX_BT_STRING 256 
char bt_string[MAX_BT_STRING]; 
snprintf(bt_string, MAX_BT_STRING," Error: cmd=%02hX, res=%02hX\n", CMD_SEND_CID, res); 
bluetooth_println(bt_string); 
+0

謝謝。總是很簡單。偉大的作品 – Eddie

1

char *strchar str[]明顯不同。檢查this question瞭解更多詳情。

在你的問題中,你聲明bt_string爲const char *bt_string = "test",其中bt_string是指向字符串「test」中第一個字符的指針。該字符串的大小爲5個字節(不要忘記終止符\ 0);

在接下來的步驟:

sprintf(bt_string, " Error: cmd=%02hX, res=%02hX\n", CMD_SEND_CID, res); 

你傾倒超過500個字節bt_string其中只有5個字節可用空間。超過5個字節的部分會覆蓋bt_string後面的內容,這可能會導致嚴重的情況,甚至導致一些嚴重的情況,這取決於接下來的內容。

爲了解決這個問題,你必須分配足夠的存儲空間:

  1. 在棧上分配的A.S.H回答。內容在功能完成後確定。
  2. 通過malloc分配;
  3. 使用靜態關鍵字強制存儲在BSS段或DATA段中的字符串。
+0

謝謝你的看法。在輸入問題時這是一個錯字。 – Eddie