当前位置: 首页 > 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/535773/

相关文章:

  • 搜索引擎作弊网站有哪些ui培训的课程
  • 临沂 企业网站建设wordpress评论首页显示第一
  • 网站建设氺首选金手指14wordpress图片切换
  • 景区网站建设案例宁波产品网站设计模板
  • 转行做网站公众平台网站价格
  • 网站建设-应酷软件开发模型有几种各有什么特点
  • 怎么在濮阳网站做宣传图书馆网站建设背景
  • 网站打开慢原因宁波seo在线优化公司
  • 快三免费直播app安徽seo人员
  • 怎么做淘宝客的网站wordpress h标签
  • 广东网站建设发信息2345浏览器打开网址
  • 在工商局网站如果做注销公告软文广告怎么写
  • 专业制作外贸网站漳州网站建设优化推广
  • 导购网站建设展馆
  • 南城网站建设公司方案石家庄seo关键词
  • 简述网站推广的五要素科技类网站简介怎么做
  • 广西知名网站设计重庆网站设计人员
  • 如何建设一个工业品采购网站衡水建网站的公司
  • 中国十大网站建设公司网站制作专业的公司有哪些
  • 建设租房子的网站网站做跳转怎么做
  • 购物网站项目开发自己的网站怎么做优化
  • 天猫网站建设论文wordpress长文章
  • 萍乡网站建设哪家好哦2023前端开发的就业现状
  • wordpress整站模板成都网站建设g冠辰
  • flash网站源码带后台传奇网站怎么做
  • asp网站后台模板列车营销网站怎么做
  • 做网站时导航条一般用什么样式培训学校网站建设
  • 玉溪做网站的公司百度推广多少钱一个月
  • 晋中推广型网站建设win7版本的wordpress
  • 苏州网站推广建设wordpress访问很慢吗