C++实现字符串切割的两种方法

目录
  • 字符串切割的两种方法
    • 1、通过stl实现
    • 2、通过使用strtok()函数实现
  • 字符串分割&类型转换(string->double)

字符串切割的两种方法

字符串切割的使用频率还是挺高的,string本身没有提供切割的方法,但可以使用stl提供的封装进行实现或者通过c函数strtok()函数实现。

1、通过stl实现

涉及到string类的两个函数find和substr:

1、find函数

  • 原型:size_t find ( const string& str, size_t pos = 0 ) const;
  • 功能:查找子字符串第一次出现的位置。
  • 参数说明:str为子字符串,pos为初始查找位置。
  • 返回值:找到的话返回第一次出现的位置,否则返回string::npos

2、substr函数

  • 原型:string substr ( size_t pos = 0, size_t len = npos ) const;
  • 功能:获得子字符串。
  • 参数说明:pos为起始位置(默认为0),len为字符串长度(默认为npos)
  • 返回值:子字符串

代码如下:

std::vector<std::string> splitWithStl(const std::string &str,const std::string &pattern)
{
    std::vector<std::string> resVec;
    if ("" == str)
    {
        return resVec;
    }
    //方便截取最后一段数据
    std::string strs = str + pattern;
    
    size_t pos = strs.find(pattern);
    size_t size = strs.size();
    while (pos != std::string::npos)
    {
        std::string x = strs.substr(0,pos);
        resVec.push_back(x);
        strs = strs.substr(pos+1,size);
        pos = strs.find(pattern);
    }
    
    return resVec;
}

2、通过使用strtok()函数实现

  • 原型:char *strtok(char *str, const char *delim);
  • 功能:分解字符串为一组字符串。s为要分解的字符串,delim为分隔符字符串。
  • 描述:strtok()用来将字符串分割成一个个片段。参数s指向欲分割的字符串,参数delim则为分割字符串,当strtok()在参数s的字符串中发现到参数delim的分割字符时 则会将该字符改为\0 字符。在第一次调用时,strtok()必需给予参数s字符串,往后的调用则将参数s设置成NULL。每次调用成功则返回被分割出片段的指针。
  • 其它:strtok函数线程不安全,可以使用strtok_r替代。

代码如下:

std::vector<std::string> split(const std::string &str,const std::string &pattern)
{
    //const char* convert to char*
    char * strc = new char[strlen(str.c_str())+1];
    strcpy(strc, str.c_str());
    std::vector<std::string> resultVec;
    char* tmpStr = strtok(strc, pattern.c_str());
    while (tmpStr != NULL)
    {
        resultVec.push_back(std::string(tmpStr));
        tmpStr = strtok(NULL, pattern.c_str());
    }
    
    delete[] strc;
    
    return resultVec;
};

字符串分割&类型转换(string->double)

【自己备用】

代码如下(示例):

#include<sstring>//头文件
#include<iostream>
using namespace std;
int main()
{
    string line; 
    ifstream is("2011_6.txt");
    while(is>>line)
    {
        cout<<line<<endl;
        istringstream   is1(line.substr(line.find("C")+2,line.find(",")-2));   //创建一个istringstream对象,目的是将()中的字符串转换为数字型
        // cout<<line.find("C")<<"    "<<line.find(",")<<endl;
        double o_x, o_y, r;
        is1>>o_x;         //将转换后的数字输入o_x
        cout<<o_x<<endl;
        line.erase(line.find("C"),line.find(",")+1);    //将字符串中已经用过的部分擦除,为后面的字符串处理提供便利
        cout<<line<<endl;
        //cout<<line.find(",")<<endl;
        istringstream is2(line.substr(0,line.find(",")));
        is2>>o_y;
        cout<<o_y<<endl;
        line.erase(0,line.find(",")+1);
        cout<<line<<endl;
        istringstream is3(line.substr(0,line.find(";")));
        is3>>r;
        cout<<r<<endl;
        line.erase(0,line.find(";")+1);
        cout<<line<<endl;
    }
}
  • substr(m,n)表示从位置m开始截取n个字符,返回字符串,m默认0
  • erase(m,n) 表示从位置m开始擦除n个字符,返回字符串,m默认0
  • find(字符a)表示返回字符a所在的位置

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • C语言与C++中关于字符串使用的比较

    目录 相似处 字符串字面值 C++标准库string类型 相似处   C++作为C的进阶版,可以调用C的库函数.C++标准库包括了C标准库,C++头文件cctype其实就利用了C的ctype.h中的库函数.在C++中使用C的头文件都会在前面加c,比如C的name.h在C++就是cname.   为了与C兼容,C++有字符串字面值,也就是类似"hello world"这种,但是这和string类型不一样,视编译器而定string最后不一定有’\0’. 字符串字面值   字符串字面值是一串

  • C++中string字符串分割函数split()的4种实现方法

    目录 一.使用stringstream流 二.使用string类提供的find方法与substr方法 三.使用C库函数strtok 四.使用regex_token_iterator(正则表达式) 总结 如: string str1 = "This is a test"; string str2 = "This-is-a-test"; string str2 = "This+is+a+test"; 我们如何将以上字符串按照某种分隔符( ,-,+),

  • C++超详细讲解字符串类

    目录 一.历史遗留问题 二.解决方案 三.标准库中的字符串类 四.字符串循环右移 五.小结 一.历史遗留问题 C 语言不支持真正意义上的字符串 C 语言用字符数组和一组函数实现字符串操作 C 语言不支持自定义类型,因此无法获得字符串类型 二.解决方案 从 C 到 C++ 的进化过程引入了自定义类型 在 C++ 中可以通过类完成字符串类型的定义 三.标准库中的字符串类 C++ 语言直接支持 C 语言的所有概念 C++ 语言中没有原生的字符串类型 C++ 标准库提供了 string 类型 strin

  • 基于C++实现去除字符串头尾指定字符功能

    目录 一.从头部开始去除指定字符 二.去除尾部指定的字符 三.测试比较 编程时我们经常需要对字符串进行操作,其中有一项操作就是去除字符串的头(尾)指定的字符,比如空格.通常我们会使用封装好的库函数或者类函数的Trim方法来实现,如果自己动手写一个TrimHead和TrimTail函数该如何实现呢? 本文针对字符串头(尾)部指定的字符的去除,分别给出两个实现方法.并分别比较一下改进后的性能如何? 一.从头部开始去除指定字符 首先从头遍历,直到遇见第一个非指定字符,此后将后续字符按顺序逐一前移. /

  • 在C++中把字符串转换为整数的两种简单方法

    目录 C++中的数据类型 如何在C++中声明和初始化 int s 如何在C++中声明和初始化 string s 如何使用 stoi() 函数将字符串转换为int 如何使用stringstream 类将一个字符串转换为一个int 总结 当你用C++编码时,经常会有这样的时候,你会想把一种数据类型转换为另一种. 在这篇文章中,你将看到两种最流行的方法来学习如何在C++中把字符串转换为整数. 让我们开始吧! C++中的数据类型 C++编程语言有一些内置的数据类型. int,用于整数(整数)(例如10,

  • C++实现字符串切割的两种方法

    目录 字符串切割的两种方法 1.通过stl实现 2.通过使用strtok()函数实现 字符串分割&类型转换(string->double) 字符串切割的两种方法 字符串切割的使用频率还是挺高的,string本身没有提供切割的方法,但可以使用stl提供的封装进行实现或者通过c函数strtok()函数实现. 1.通过stl实现 涉及到string类的两个函数find和substr: 1.find函数 原型:size_t find ( const string& str, size_t p

  • MySql逗号拼接字符串查询的两种方法

    下面两个函数的使用和FIND_IN_SET一样,使用时只需要把FIND_IN_SET换成FIND_PART_IN_SET或FIND_ALL_PART_IN_SET 例如某字段里是为1,2,3,4,5 使用方法: 第一种,传入1,3,6  可以查出来 select * from XXX where FIND_PART_IN_SET('1,3,6','1,2,3,4,5') 第二种,传入1,3,6  查不出来 select * from XXX where FIND_ALL_PART_IN_SET(

  • PHP判断字符串长度的两种方法很实用

    php程序中字符串长度判断,可以使用strlen. 方法一: $str = 'aaaaaa'; if(strlen($str) > 6){ echo "字符串大于6"; } 方法二: if(isset($str{6}){ } 以上两种方法,第二种效率更高些. 在PHP中,所有的变量都是用一个结构-zval来保存的,strlen虽然是直接获取其中的len,但是仍然有一次函数调用,而isset是PHP的语法结构,所以更快!所以在判断字符串是否大于或小于多少个字符时可以使用第二种方法.

  • JavaScript访问字符串中单个字符的两种方法

    概述 JavaScript是一门很灵活的语言,也提供了很多原生的函数供我们编程使用.这篇文章主要对javascript中如何访问字符串中的单个字符做一下介绍. javascript中一切皆为对象,要访问字符串中的单个字符主要有两种方法:数组索引和charAt()函数. 索引和charAt() 索引方式访问单个字符串 在javascript中,字符串可以被当做数组来处理,所以我们可以用数组下标的方式来访问单个字符.代码如下: 复制代码 代码如下: <script type="text/jav

  • 正则表达式实现字符串每4位后自动加空格效果(两种方法)

    需求:输入框中输入银行卡号(或其他)时,每4位自动加空格(如下图) 分析 方法一:监控输入框的keyup事件,当value值的长度为4,8,12,16时,插入空格字符串" "(vue中代码片段如下) <input type="text" v-model="bankCard" @keyup="bankCardKeyup"> bankCardKeyup (e) { let self = this // 如果是删除键,则

  • PHP正则验证字符串是否为数字的两种方法并附常用正则

    php 正则验证字符串是否为数字 方法一: php中利用正则表达式验证字符串是否为数字一件非常容易的事情,最主要的是如何写好正则表达式以及掌握正则表达式的写法,在此利用正则表达式的方式来列举一下判断数字的方法. <? if($str) { if(eregi("^[0-9]+$",$str)) { $str=(int)$str; } else { echo "获取到的数据不是有效的数字类型,操作将停止!"; exit(); } } else { echo &qu

  • Java字符串的压缩与解压缩的两种方法

    应用场景 当字符串太长, 需要将字符串值存入数据库时,如果字段长度不够,则会出现插入失败: 或者需要进行Http传输时,由于参数长度过长造成http传输失败等. 字符串压缩与解压方法 方法一:用 Java8中的gzip /** * 使用gzip压缩字符串 * @param str 要压缩的字符串 * @return */ public static String compress(String str) { if (str == null || str.length() == 0) { retu

  • C语言实现倒置字符串的两种方法分享

    目录 前言 一.题目 二.思路讲解 三.代码实现 四.代码总结 五.第二种方法倒置字符串 六.总结 前言 今天在牛客网上刷了一道题,我感觉挺有意义的,现在我就分享给大家,并且告诉大家解题思路. 一.题目 事例: 输入下列字符: I like beijing. 输出的字符: beijing. like I 二.思路讲解 1.设立一个数组存放输入的字符串 2.将其中每个单词进行逆置 得到 I ekil .gnjieb 3.再将字符串逆置  得到beijing.like I 三.代码实现 1.设立一个

  • java字符串反转的7种方法

    目录 1.用stringBuffer或者stringBuilder自带的reverse方法 2.将字符串拆分为char数组 3.stringBuffer倒序拼接 4.利用栈的先进后出 5.二分换位反转 6.切割递归反转 7.二分递归反转 1.用stringBuffer或者stringBuilder自带的reverse方法     public static String reverseTestOne(String s) {         return new StringBuffer(s).r

  • Ajax中解析Json的两种方法对比分析

    eval();  //此方法不推荐 JSON.parse();  //推荐方法 一.两种方法的区别 我们先初始化一个json格式的对象: var jsonDate = '{ "name":"周星驰","age":23 }' var jsonObj = eval( '(' + jsonDate + ')' ); // eval();方法 var jsonObj = JSON.parse( jsonDate ); // JSON.parse(); 方

随机推荐