在LKSNAPSHOT.cpp中解析接收串口的字符串时有一句:

string cmd = msg.substr(cmdstr.length()+1,cmdstr.length()-cmdstr.length()-1);

怀疑substr的参数写错了,然后查到相关资料,发现当长度大于字符串的长度或者小于0时,其默认至字符串末尾,因此该行语句能正常工作。

具体的说法如下:

这个函数的原型是substr(size_type off,size_type count)

第一个参数表示在string的char数组中的偏移量,count是从这个偏移的位置开始,字串的长度。

这两个参数的错误使用将导致程序crash或者获得错误的结果。

主要两种错误情况,off大于数组的长度或者小于0,和count大于字符串的长度或者count小于0

对于off的错误,当其大于数组的长度是,即是数组越界错误,程序crash。
当提供的off小于0时,由于参数类型为unsigned int,所以将做强制转化,off变为一个很大的整数,因而还是导致越界错误,程序crash。

对于count的错误,当 count + off大于数组的长度时,substr内部会先判断是否其超过数组的长度,如果超过,其将按照数组的最大下标处理。因而其等同于substr(off,string.size()-off);

同理,当count小于0时,其将转化为一个很大的整数,结果还是等同于substr(off,string.size()-off);

综上,在使用该函数时,一定要注意传入的参数,以防止程序crash,或者获得错误的结果。

转载于:https://www.cnblogs.com/ph829/p/4146860.html

关于string的成员函数substr相关推荐

  1. 【笔试】:编程实现C++string 类成员函数

    http://blog.csdn.net/wangshihui512/article/details/9792309 已知String类声明如下: [cpp] view plaincopy print ...

  2. leetcode中使用c++需要注意的点以及各类容器的初始化、常用成员函数

    目录 1.传引用 2.vector使用 初始化方法 常用成员函数 3.字符串string 初始化方法 常用成员函数 4.哈希表 unordered_map 初始化 常用成员函数 示例:计数器 5.哈希 ...

  3. 重载运算符作为成员函数还是非成员函数

    一.定义为成员函数的运算符 1. 赋值.调用.下标.成员访问箭头运算符(=.().[].->) 2. 改变对象状态的运算符或者与给定类型密切相关的运算符(递增++.递减--.解引用*) 3. 复 ...

  4. java类成员方法(成员函数)的初步介绍

    定义一个Person类,添加以下成员函数对Person类完善 1.speak成员函数:输出"我是大好人" 2.jisuan成员函数:可以输入一个数n,计算1+2+....+n 3. ...

  5. string函数_C++[06] string成员函数之删除函数erase

    介绍一下删除函数erase,老方法,新建cpp文件,并找到string的erase成员函数,可以看到,erase有3个重载函数 右键转到定义,可以查看erase的源码 _Myt& erase( ...

  6. String类 写出类的成员函数实现

    *************************************************** 更多精彩,欢迎进入:http://shop115376623.taobao.com ****** ...

  7. C++ string 成员函数 length() size() 和 C strlen() 的区别

    1.函数申明 C++ string 成员函数 length() 等同于 size(),但是和 C 库函数 strlen() 有着本质区别,使用时切勿混淆.首先看一下三个函数的申明: // 返回 str ...

  8. list排序成员函数对string对象与char*对象排序的差别

    对list容器中的对象排序,不能使用sort()算法,只能采用其自身的排序函数sort().因为,算法sort()只支持随机存取的容器的排序,如vector等. 对基本数据对象list排序:成员函数s ...

  9. 【c++】string模拟实现(三大基本成员函数)

    string的模拟实现是数据结构与类对象知识的综合运用. 目录 文章目录 前言 二.基本的三大函数 1.default构造 1)传统写法(本本分分地开空间进行深拷贝) 2)default无现代写法 2 ...

最新文章

  1. 边缘加速创新和AI应用,Xilinx推出Kria自适应系统模块产品组合
  2. Python 中 zip() 函数的用法
  3. openssl之EVP系列之2---对称加密算法概述
  4. 使用jsp:useBean指令
  5. Java 应用性能调优,可视化工具
  6. mysql悲观锁 更新_MySQL学习笔记(四)悲观锁 for update
  7. mysql一张表最多多少索引_MySQL一个索引最多有多少个列?真实的测试例子
  8. mysql判断是否在日期区间_通过sql判断时间区间是否存在数据
  9. Python str和bytes的相互转换
  10. 关于Oracle-SQL语句性能优化
  11. 飞思卡尔16位单片机(三)——GPIO输出功能测试
  12. 【NLP】依存句法关系符号解释
  13. 怎样自制微信gif动态表情包?
  14. Python爬虫——爬去必应壁纸(简化版)
  15. increment java_Java LongAdder increment()用法及代码示例
  16. 【电脑新硬盘如何分区】
  17. 关于logcat的使用
  18. 踩坑之路:finish方法执行后居然还有这种操作?
  19. 华为西安鲲鹏服务器项目,眼见为实,华为鲲鹏架构服务器生态大揭秘
  20. Java中的包(package)详情解释

热门文章

  1. Mac 使用SSH远程登录
  2. 如何利用抽象工厂更换数据库
  3. http经典书籍--http权威指南
  4. 力扣--盛水最多的容器
  5. new/delete与malloc/free的区别与联系详解
  6. 将十六进制的字符串转换成整数
  7. 常考数据结构与算法:在转动过的有序数组中寻找目标值
  8. 数据结构:选择排序(Selection sort)
  9. xmlWriter以UTF-8格式写xml问题
  10. SpringBoot-04:SpringBoot在idea中的俩种创建方式