需要帮助处理CHAR字符串与printf

时间:2016-12-21 05:11:55

标签: c avr

我正在使用softserial与蓝牙调制解调器通信,我正在使用以下代码将字符串推送到串口:

document.forms

我需要能够用

替换字符串
char bt_string = "test";
bluetooth_println(bt_string);

我尝试过以下代码

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

但它没有输出任何东西。我显然误解了一些事情。谢谢你的帮助。

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分: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);

您将超过5个字节转储到bt_string,它只有5个字节的可用空间。超过5个字节的部分将覆盖bt_string之后的内容,这可能会导致一些严重的情况或什么都没有,这取决于所遵循的内容。

要解决此问题,您必须分配足够的内存空间:

  1. 在A.S.H回答时在堆栈上分配。功能完成后确定内容。
  2. 通过malloc分配;
  3. 使用静态关键字强制存储在BSS部分或DATA部分中的字符串。