2016-12-21 9 views
-1

Я использую softserial общаться с модемом Bluetooth и Я толкаю строки к сериалу, используя следующий код:Нужна помощь обработки 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 *str и char 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); 

Вы размещали более чем 5 байт bt_string, который имеет только 5 байт доступного пространства. Части за пределами 5 байтов будут перезаписывать содержимое после bt_string, что может привести к некоторой серьезной ситуации или ничего, это зависит от того, что следует.

Чтобы решить эту проблему, нужно выделить достаточно места в памяти:

  1. выделить на стеке ответил A.S.H. содержимое определяется после завершения функции.
  2. выделить через malloc;
  3. используйте статическое ключевое слово, чтобы заставить строку хранить в разделе BSS или в разделе DATA.
+0

спасибо, что посмотрели это. Это была опечатка при вводе вопроса. – Eddie