iis网站视频无法播放,国家职业资格证书网站,中国航空技术北京有限公司,网站建设摊销年限最新规定问题描述
刚刚写一个用AT指令透传相关的函数#xff0c;需要用到sprintf()拼接字符串。 结果发现sprintf()拼接出来的内容是错误的#xff0c;简化后的代码如下#xff1a;
const char AT_CIPSEND_FIX_LENGTH_HEADER[11] ATCIPSEND; // 错误的#xff0…问题描述
刚刚写一个用AT指令透传相关的函数需要用到sprintf()拼接字符串。 结果发现sprintf()拼接出来的内容是错误的简化后的代码如下
const char AT_CIPSEND_FIX_LENGTH_HEADER[11] ATCIPSEND; // 错误的
const char AT[] AT\r\n;void ESP8285_CipSend_FixLength(char* data, uint8_t length)
{static char AT_CIPSEND_FIX_LENGTH_FRALME[16] {0};sprintf(AT_CIPSEND_FIX_LENGTH_FRALME, %s, AT_CIPSEND_FIX_LENGTH_HEADER);
}简化后的代码其实就是把AT_CIPSEND_FIX_LENGTH_HEADER的内容打印到AT_CIPSEND_FIX_LENGTH_FRALME里面结果一看AT_CIPSEND_FIX_LENGTH_FRALME里面出现了多余的内容。 很显然多余的内容就是AT_CIPSEND_FIX_LENGTH_HEADER字符串后面的内容即AT字符串的内容。
问题原因
问题的原因其实很简单AT_CIPSEND_FIX_LENGTH_HEADER字符串长度是11位的没有把作为字符串结尾的\0算进去
因此在用sprintf()的时候没有正确的找到字符串的结尾把内存后面AT字符串的结尾当成字符串的结尾了所以spinrtf()的输出结果是两个字符串的拼接
正确改法1
可以改写成如下
const char AT_CIPSEND_FIX_LENGTH_HEADER[12] ATCIPSEND; // 指定长度为12
const char AT[] AT\r\n;
void ESP8285_CipSend_FixLength(char* data, uint8_t length)
{static char AT_CIPSEND_FIX_LENGTH_FRALME[16] {0};sprintf(AT_CIPSEND_FIX_LENGTH_FRALME, %s, AT_CIPSEND_FIX_LENGTH_HEADER);
}正确改法2
也可以直接不指定长度改写如下
const char AT_CIPSEND_FIX_LENGTH_HEADER[] ATCIPSEND; // 不指定长度
const char AT[] AT\r\n;void ESP8285_CipSend_FixLength(char* data, uint8_t length)
{static char AT_CIPSEND_FIX_LENGTH_FRALME[16] {0};sprintf(AT_CIPSEND_FIX_LENGTH_FRALME, %s, AT_CIPSEND_FIX_LENGTH_HEADER);
}错误改法
但这个问题很容易被掩盖因为像如下这么写结果可能也是对的取消掉const长度是11但其实是错误的在某些情况下会出错
char AT_CIPSEND_FIX_LENGTH_HEADER[11] ATCIPSEND; // 错误的
const char AT[] AT\r\n;void ESP8285_CipSend_FixLength(char* data, uint8_t length)
{static char AT_CIPSEND_FIX_LENGTH_FRALME[16] {0};sprintf(AT_CIPSEND_FIX_LENGTH_FRALME, %s, AT_CIPSEND_FIX_LENGTH_HEADER);
}在之前的写法中两个字符串都是常量在常量存储区存储位置是连续的。
如果把第一个字符串的const修饰去掉那么AT_CIPSEND_FIX_LENGTH_HEADER在全局变量存储区会被加载到内存中而AT字符串则在常量存储区这时候两个变量就不是连续的了因此不会出现“spinrtf()的输出结果是两个字符串的拼接”的情况了。 在这种情况下sprintf()的输出结果就取决于什么时候碰到\0了。
所以使用sprintf()有缓冲区溢出的风险可以使用snprintf() 其接受一个额外的参数size用于指定目标缓冲区的大小。它在写入时会限制写入的长度以避免缓冲区溢出更安全。