字符串数字转整型-不使用标准库

  • 防止反复造轮子
/**
* @brief Str2Int 找到第一个连续整形数字
* @param str 输入
* @param out 输出
* @return 截止位置
*/
int Str2Int(const char *str, int *out)
{
   quint8 *sym = (quint8 *)str;
   quint8 * num_op = (quint8 *)str;
   quint8 carry_bit_count = 1;
   quint8 num_count = 0;
   int ret = 0;
   *out = -0x7fffffff;
   bool is_find = false;
   for(;*num_op != '\0'; ++num_op){
       if(*num_op >= ASCII_ZERO && *num_op <= ASCII_NINE){//找到第一个数字
           ret = ret * 10 + *num_op - ASCII_ZERO;
           carry_bit_count *= 10;
           if(ret < 0)//溢出
               return (quint64)num_op - (quint64)str + 1;
           ++num_count;
           is_find = true;
           if(*(num_op + 1) < ASCII_ZERO || *(num_op + 1) > ASCII_NINE){//遇到非数字结束
               break;
           }
       }
   }
   if(is_find){
       if((quint64)num_op - (quint64)str > num_count){//符号位
           sym = num_op - num_count;
       }
       if(*sym == ASCII_SYM_DEC) {//如果是负号
           *out = -ret;
       } else {
           *out = ret;
       }
   }

   return (quint64)num_op - (quint64)str + 1;
}
  • Qt中应用
/**
 * @brief FilterIntNum 分别提取出其他内容和整形数
 * @param str 源数据
 * @param strNums 其中的整形数
 * @param strContents 其他内容
 */
void FilterIntNum(const QString &str, QList<QString> &strNums, QList<QString> &strContents)
{
    int out;
    std::string strTemp  = str.toStdString();
    for(unsigned int i = 0; i < strTemp.size();){
        unsigned int offset = Str2Int(strTemp.c_str() + i, &out);
        if(out != -0x7FFFFFFF){
            strNums.append( QString("%1").arg(out) );
            strContents.append(QString(strTemp.substr(i, offset - strNums.last().size()).c_str()));
        }else{
            strContents.append(QString(strTemp.substr(i, offset).c_str()));
        }
        i += offset;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值