zoukankan      html  css  js  c++  java
  • 关于string的成员函数substr

    在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,或者获得错误的结果。

  • 相关阅读:
    鸟哥私房菜*基础篇(3)
    Java 基于Graphics2D绘制电子收据图片
    微信扫码支付沙盒测试,解决沙盒环境下签名验证失败
    JAVA对象合集,根据条件过滤
    java对象根据字段进行排序
    vue 弹窗调用父窗口函数
    php使用post功能,调用微信推送服务
    JS字符串截取
    关于两个 IQueryable 合并
    bootstrap清除数据源
  • 原文地址:https://www.cnblogs.com/ph829/p/4146860.html
Copyright © 2011-2022 走看看