当前位置: 首页 > news >正文

自助网站建设系统源码武安网站建设价格

自助网站建设系统源码,武安网站建设价格,网站需要哪些备案,南京城市规划建设展览馆网站问题描述 刚刚写一个用AT指令透传相关的函数,需要用到sprintf()‌拼接字符串。 结果发现sprintf()‌拼接出来的内容是错误的,简化后的代码如下: const char AT_CIPSEND_FIX_LENGTH_HEADER[11] "ATCIPSEND"; // 错误的&#xff0…

问题描述

刚刚写一个用AT指令透传相关的函数,需要用到sprintf()‌拼接字符串。
结果发现sprintf()‌拼接出来的内容是错误的,简化后的代码如下:

const char AT_CIPSEND_FIX_LENGTH_HEADER[11] = "AT+CIPSEND=";	// 错误的!!!	
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] = "AT+CIPSEND=";	// 指定长度为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[] = "AT+CIPSEND=";		// 不指定长度	
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] = "AT+CIPSEND=";		// 错误的!!
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,用于指定目标缓冲区的大小。它在写入时会限制写入的长度,以避免缓冲区溢出,更安全。

http://www.yayakq.cn/news/732891/

相关文章:

  • 刚接触网站建设有哪些问题小米公司的企业文化建设
  • 网站备案是否关闭html5网站制作编辑源码
  • 网站建设中是因为没有ftp上传吗杭州网站建设商城价格
  • 贵阳市 网站建设做分享衣服网站的初衷是什么意思
  • 景安网站上传完还要怎么做WordPress仿虎嗅主题
  • 网站备案提交新手如何做网站维护
  • 站长统计 wordpress注册商标去哪里注册需要多少钱
  • 快云助手网站建设视频教程做彩票网站能挣到钱吗
  • 网站怎么弄模板凡科建站添加文章
  • 网络查询网站手机应用市场
  • 集团网站群建设外企外贸是做什么的
  • 网上书城网站开发外文参考文献网站与系统开发
  • 做外贸找生意上哪个网站天津网站开发建设公司
  • 做网站用买服务器码官方查企业信息的网站
  • 网站注册建设费用设计公司展厅装修
  • 宁波网站建设优化企业大学一学一做视频网站
  • wordpress 分页函数十堰网站搜索优化价格
  • 厚街镇网站建设公司做静态网站的开题报告
  • 深圳建设网站的公司wordpress 首页logo
  • 网站建设商标保护建筑服务类网站
  • 河南省网站制作公司手机助手
  • 不允许访问网站广东建设信息网安全员查询
  • 个人网站如何在工信部备案注册网站验证码
  • 网站建设网页制作教程济南seo网站建站
  • 百货网站建设云落主题WordPress
  • 南宁建设厅官方网站浙江省建设厅老网站
  • 网站更新怎么样做更高大上无锡网站seo顾问
  • 如何判断网站是否被百度降权linux播放高清电影
  • 平度网站建设ld4邯郸网站设计培训班
  • 经典php网站开发教程蛋糕网站源码