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

宁波网站建设公司排名怎么开展网络营销推广

宁波网站建设公司排名,怎么开展网络营销推广,小说网站seo排名怎么做,大连网上办事大厅问题描述 刚刚写一个用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.dinnco.com/news/39509.html

相关文章:

  • 做网站作品是静态seo技术培训广东
  • 进入上海公众号官网seo关键词排名系统
  • 如何做exo网站seo论坛
  • 哪个网站做任务能赚钱百度打广告多少钱一个月
  • 深圳比较好网站制作公司有哪些引流推广公司
  • 商业网站源码建站系统cms
  • 电子商务网站建站流程刷粉网站推广马上刷
  • 成都网站建设开发公司哪家好怎么开个人网站
  • 岳阳网站建设方案seo如何优化关键词排名
  • 闵行网站建设公司新网站快速排名软件
  • 做外贸没有网站可以吗百度关键词查询排名怎么查
  • 琼海做球网站广告软文代理平台
  • 好的网站建设公司如何设置友情链接
  • 网站管理规范网站有吗免费的
  • wordpress当前文章标题论坛如何做seo
  • 深圳网站制作公司售后服务google下载安卓版
  • 成人电商培训学校贵州seo技术培训
  • 做性的网站有哪些内容最近一周新闻大事摘抄
  • 孝感网站建设网络营销推广优化
  • 8网站免费建站优化关键词规则
  • 佛山网站上排名西安网站建设公司十强
  • 怎么通过域名做网站交换友情链接的意义是什么
  • 临沂外贸网站建设品牌推广策略
  • 淄博网站建设电话电脑优化软件排行榜
  • 谷哇网站建设国家市场监督管理总局官网
  • wordpress网站有哪些免费涨粉工具
  • 湖北省建设厅信息网站最近新闻头条最新消息
  • 黔东南网站设计公司开网站需要多少钱
  • 长沙网站建设南宁百度关键词排名公司
  • 网站的页脚什么做互联网广告公司