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

大理如何做百度的网站沈阳网站制作优化

大理如何做百度的网站,沈阳网站制作优化,网站开发 xmind,iis7 wordpress 伪静态规则问题描述 刚刚写一个用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/171714/

相关文章:

  • 广州做网站系统建筑资料网站大全
  • wordpress免费建站wordpress 页面调新闻
  • 公司建站网站永嘉县住房建设局网站
  • 国内外建筑设计网站视频资源的网站怎么做
  • 网站原创文章规范传奇游戏网页
  • 洪都建设集团有限公司网站wordpress 评论表情
  • 网站建设佰首选金手指十七读书网站建设策划书
  • 在海外做网站 卖东西品牌推广费
  • 爱站网络科技有限公司网站找哪家做
  • 广西柳州网站建设小程序公司广州网站建设怎么样
  • 做网站需要用到的软件淘宝网页版评价管理在哪里
  • wordpress 写文章成都网站优化服务
  • app设计网站有哪些功能网站开发如何
  • 公司网站介绍模板 htmlwordpress静态文件目录
  • 阳江公司做网站如何做网站推广自己的产品
  • 建设部网站资质查询6网站建设吉金手指排名15
  • 电子商务网站建设与电子支付wordpress 音乐cms
  • 电脑做系统哪个网站比较好用晋江小学网站建设
  • 网站建设售后服务方案建筑公司企业愿景范文简短
  • 网站建设公司的岗位职责房屋租赁网站开发意义
  • 推荐做微商海报的网站典当行网站策划
  • 上海工程网站建设成品网站 子目录打不开
  • python 网站建设 拖拽式小型购物网站开发费用
  • dede 网站建设模板网站建设项目收获
  • 怎么看网站是不是h5做的自己做的网站二维码怎么做的
  • 沈阳工伤保险做实网站多版本wordpress
  • wordpress自定义链接不能用seo快速排名软件价格
  • 低价网站空间公司在线起名免费网
  • 网站构成三要素老师做家教的网站
  • 建设网站好公司淘宝毕业设计网站代做