C++切割字符串 深藏阁楼爱情的钟 2022-03-28 10:55 512阅读 0赞 转载:本文实例汇总了C++常用字符串分割方法,分享给大家供大家参考。具体分析如下: string str;getline(cin,str);getline函数是遇回车符结束输入,而一般的CIN是遇到空格之类的就结束输入 string 类可以。需要注意的是输入字符串到这个(getline(cin,str)) 我们在编程的时候经常会碰到字符串分割的问题,这里总结下,也方便我们以后查询使用。 **一、用strtok函数进行字符串分割** 原型: char \*strtok(char \*str, const char \*delim); 功能:分解字符串为一组字符串。 参数说明:str为要分解的字符串,delim为分隔符字符串。 返回值:从str开头开始的一个个被分割的串。当没有被分割的串时则返回NULL。 其它:strtok函数线程不安全,可以使用strtok\_r替代。 示例: <table> <tbody> <tr> <td> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> <p>8</p> <p>9</p> <p>10</p> <p>11</p> <p>12</p> <p>13</p> <p>14</p> <p>15</p> <p>16</p> <p>17</p> <p>18</p> </td> <td> <p><code>//借助strtok实现split</code></p> <p><code>#include <string.h></code></p> <p><code>#include <stdio.h></code></p> <p> </p> <p><code>int</code> <code>main()</code></p> <p><code>{ </code></p> <p><code> </code><code>char</code> <code>s[] = </code><code>"Golden Global View,disk * desk"</code><code>;</code></p> <p><code> </code><code>const</code> <code>char</code> <code>*d = </code><code>" ,*"</code><code>;</code></p> <p><code> </code><code>char</code> <code>*p;</code></p> <p><code> </code><code>p = </code><code>strtok</code><code>(s,d);</code></p> <p><code> </code><code>while</code><code>(p)</code></p> <p><code> </code><code>{ </code></p> <p><code> </code><code>printf</code><code>(</code><code>"%s\n"</code><code>,p);</code></p> <p><code> </code><code>p=</code><code>strtok</code><code>(NULL,d);</code></p> <p><code> </code><code>}</code></p> <p> </p> <p><code> </code><code>return</code> <code>0;</code></p> <p><code>}</code></p> </td> </tr> </tbody> </table> 运行效果如下图所示: ![2014108101416933.png_201498101535][] **二、用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 n = npos ) const; 功能:获得子字符串。 参数说明:pos为起始位置(默认为0),n为结束位置(默认为npos) 返回值:子字符串 实现如下: <table> <tbody> <tr> <td> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> <p>8</p> <p>9</p> <p>10</p> <p>11</p> <p>12</p> <p>13</p> <p>14</p> <p>15</p> <p>16</p> <p>17</p> <p>18</p> <p>19</p> <p>20</p> </td> <td> <p><code>//字符串分割函数</code></p> <p><code>std::vector<std::string> split(std::string str,std::string pattern)</code></p> <p><code>{ </code></p> <p><code> </code><code>std::string::size_type pos;</code></p> <p><code> </code><code>std::vector<std::string> result;</code></p> <p><code> </code><code>str+=pattern;</code><code>//扩展字符串以方便操作</code></p> <p><code> </code><code>int</code> <code>size=str.size();</code></p> <p> </p> <p><code> </code><code>for</code><code>(</code><code>int</code> <code>i=0; i<size; i++)</code></p> <p><code> </code><code>{ </code></p> <p><code> </code><code>pos=str.find(pattern,i);</code></p> <p><code> </code><code>if</code><code>(pos<size)</code></p> <p><code> </code><code>{ </code></p> <p><code> </code><code>std::string s=str.substr(i,pos-i);</code></p> <p><code> </code><code>result.push_back(s);</code></p> <p><code> </code><code>i=pos+pattern.size()-1;</code></p> <p><code> </code><code>}</code></p> <p><code> </code><code>}</code></p> <p><code> </code><code>return</code> <code>result;</code></p> <p><code>}</code></p> </td> </tr> </tbody> </table> 完整代码: <table> <tbody> <tr> <td> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> <p>8</p> <p>9</p> <p>10</p> <p>11</p> <p>12</p> <p>13</p> <p>14</p> <p>15</p> <p>16</p> <p>17</p> <p>18</p> <p>19</p> <p>20</p> <p>21</p> <p>22</p> <p>23</p> <p>24</p> <p>25</p> <p>26</p> <p>27</p> <p>28</p> <p>29</p> <p>30</p> <p>31</p> <p>32</p> <p>33</p> <p>34</p> <p>35</p> <p>36</p> <p>37</p> <p>38</p> <p>39</p> <p>40</p> <p>41</p> <p>42</p> <p>43</p> <p>44</p> <p>45</p> <p>46</p> <p>47</p> <p>48</p> <p>49</p> <p>50</p> <p>51</p> </td> <td> <p><code>/*</code></p> <p><code> </code><code>File : split1.cpp</code></p> <p><code> </code><code>Author : Mike</code></p> <p><code> </code><code>E-Mail : Mike_Zhang@live.com</code></p> <p><code> </code><code>*/</code></p> <p><code>#include <iostream></code></p> <p><code>#include <string></code></p> <p><code>#include <vector></code></p> <p> </p> <p><code>//字符串分割函数</code></p> <p><code>std::vector<std::string> split(std::string str,std::string pattern)</code></p> <p><code>{ </code></p> <p><code> </code><code>std::string::size_type pos;</code></p> <p><code> </code><code>std::vector<std::string> result;</code></p> <p><code> </code><code>str+=pattern;</code><code>//扩展字符串以方便操作</code></p> <p><code> </code><code>int</code> <code>size=str.size();</code></p> <p> </p> <p><code> </code><code>for</code><code>(</code><code>int</code> <code>i=0; i<size; i++)</code></p> <p><code> </code><code>{ </code></p> <p><code> </code><code>pos=str.find(pattern,i);</code></p> <p><code> </code><code>if</code><code>(pos<size)</code></p> <p><code> </code><code>{ </code></p> <p><code> </code><code>std::string s=str.substr(i,pos-i);</code></p> <p><code> </code><code>result.push_back(s);</code></p> <p><code> </code><code>i=pos+pattern.size()-1;</code></p> <p><code> </code><code>}</code></p> <p><code> </code><code>}</code></p> <p><code> </code><code>return</code> <code>result;</code></p> <p><code>}</code></p> <p> </p> <p><code>int</code> <code>main()</code></p> <p><code>{ </code></p> <p><code> </code><code>std::string str;</code></p> <p><code> </code><code>std::cout<<</code><code>"Please input str:"</code><code><<std::endl;</code></p> <p><code> </code><code>//std::cin>>str;</code></p> <p><code> </code><code>getline(std::cin,str);</code></p> <p><code> </code><code>std::string pattern;</code></p> <p><code> </code><code>std::cout<<</code><code>"Please input pattern:"</code><code><<std::endl;</code></p> <p><code> </code><code>//std::cin>>pattern;</code></p> <p><code> </code><code>getline(std::cin,pattern);</code><code>//用于获取含空格的字符串</code></p> <p><code> </code><code>std::vector<std::string> result=split(str,pattern);</code></p> <p><code> </code><code>std::cout<<</code><code>"The result:"</code><code><<std::endl;</code></p> <p><code> </code><code>for</code><code>(</code><code>int</code> <code>i=0; i<result.size(); i++)</code></p> <p><code> </code><code>{ </code></p> <p><code> </code><code>std::cout<<result[i]<<std::endl;</code></p> <p><code> </code><code>}</code></p> <p> </p> <p><code> </code><code>std::cin.get();</code></p> <p><code> </code><code>std::cin.get();</code></p> <p><code> </code><code>return</code> <code>0;</code></p> <p><code>}</code></p> </td> </tr> </tbody> </table> 运行效果如下图所示: ![2014108101431319.png_201498101522][] **三、用Boost进行字符串的分割** 用boost库的正则表达式实现字符串分割 实现如下: <table> <tbody> <tr> <td> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> <p>8</p> <p>9</p> <p>10</p> <p>11</p> <p>12</p> </td> <td> <p><code>std::vector<std::string> split(std::string str,std::string s)</code></p> <p><code>{ </code></p> <p><code> </code><code>boost::regex reg(s.c_str());</code></p> <p><code> </code><code>std::vector<std::string> vec;</code></p> <p><code> </code><code>boost::sregex_token_iterator it(str.begin(),str.end(),reg,-1);</code></p> <p><code> </code><code>boost::sregex_token_iterator end;</code></p> <p><code> </code><code>while</code><code>(it!=end)</code></p> <p><code> </code><code>{ </code></p> <p><code> </code><code>vec.push_back(*it++);</code></p> <p><code> </code><code>}</code></p> <p><code> </code><code>return</code> <code>vec;</code></p> <p><code>}</code></p> </td> </tr> </tbody> </table> 完整代码: <table> <tbody> <tr> <td> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> <p>8</p> <p>9</p> <p>10</p> <p>11</p> <p>12</p> <p>13</p> <p>14</p> <p>15</p> <p>16</p> <p>17</p> <p>18</p> <p>19</p> <p>20</p> <p>21</p> <p>22</p> <p>23</p> <p>24</p> <p>25</p> <p>26</p> <p>27</p> <p>28</p> <p>29</p> <p>30</p> <p>31</p> <p>32</p> <p>33</p> <p>34</p> <p>35</p> <p>36</p> <p>37</p> <p>38</p> <p>39</p> </td> <td> <p><code>//本程序实现的是利用正则表达式对字符串实现分割</code></p> <p><code>//运行环境 VC6.0 + boost 库</code></p> <p><code>/*</code></p> <p><code> </code><code>File : split2.cpp</code></p> <p><code> </code><code>Author : Mike</code></p> <p><code> </code><code>E-Mail : Mike_Zhang@live.com</code></p> <p><code>*/</code></p> <p><code>#include <iostream></code></p> <p><code>#include <cassert></code></p> <p><code>#include <vector></code></p> <p><code>#include <string></code></p> <p><code>#include "boost/regex.hpp"</code></p> <p> </p> <p><code>std::vector<std::string> split(std::string str,std::string s)</code></p> <p><code>{ </code></p> <p><code> </code><code>boost::regex reg(s.c_str());</code></p> <p><code> </code><code>std::vector<std::string> vec;</code></p> <p><code> </code><code>boost::sregex_token_iterator it(str.begin(),str.end(),reg,-1);</code></p> <p><code> </code><code>boost::sregex_token_iterator end;</code></p> <p><code> </code><code>while</code><code>(it!=end)</code></p> <p><code> </code><code>{ </code></p> <p><code> </code><code>vec.push_back(*it++);</code></p> <p><code> </code><code>}</code></p> <p><code> </code><code>return</code> <code>vec;</code></p> <p><code>}</code></p> <p><code>int</code> <code>main()</code></p> <p><code>{ </code></p> <p><code> </code><code>std::string str,s;</code></p> <p><code> </code><code>str=</code><code>"sss/ddd/ggg/hh"</code><code>;</code></p> <p><code> </code><code>s=</code><code>"/"</code><code>;</code></p> <p><code> </code><code>std::vector<std::string> vec=split(str,s);</code></p> <p><code> </code><code>for</code><code>(</code><code>int</code> <code>i=0,size=vec.size();i<size;i++)</code></p> <p><code> </code><code>{ </code></p> <p><code> </code><code>std::cout<<vec[i]<<std::endl;</code></p> <p><code> </code><code>}</code></p> <p><code> </code><code>std::cin.get();</code></p> <p><code> </code><code>std::cin.get();</code></p> <p><code> </code><code>return</code> <code>0;</code></p> <p><code>}</code></p> </td> </tr> </tbody> </table> 运行效果如下图所示: ![2014108101441092.png_201498101510][] **补充:** 最近发现boost里面有自带的split的函数,如果用boost的话,还是直接用split的好,这里就不多说了,代码如下: <table> <tbody> <tr> <td> <p>1</p> <p>2</p> <p>3</p> <p>4</p> <p>5</p> <p>6</p> <p>7</p> <p>8</p> <p>9</p> <p>10</p> <p>11</p> <p>12</p> <p>13</p> <p>14</p> <p>15</p> <p>16</p> <p>17</p> </td> <td> <p><code>#include <iostream></code></p> <p><code>#include <string></code></p> <p><code>#include <vector></code></p> <p><code>#include <boost/algorithm/string/classification.hpp></code></p> <p><code>#include <boost/algorithm/string/split.hpp></code></p> <p><code> </code> </p> <p><code>using</code> <code>namespace</code> <code>std;</code></p> <p><code> </code> </p> <p><code>int</code> <code>main()</code></p> <p><code>{ </code></p> <p><code> </code><code>string s = </code><code>"sss/ddd,ggg"</code><code>;</code></p> <p><code> </code><code>vector<string> vStr;</code></p> <p><code> </code><code>boost::split( vStr, s, boost::is_any_of( </code><code>",/"</code> <code>), boost::token_compress_on );</code></p> <p><code> </code><code>for</code><code>( vector<string>::iterator it = vStr.begin(); it != vStr.end(); ++ it )</code></p> <p><code> </code><code>cout << *it << endl;</code></p> <p><code> </code><code>return</code> <code>0;</code></p> <p><code>}</code></p> </td> </tr> </tbody> </table> [2014108101416933.png_201498101535]: http://files.jb51.net/file_images/article/201410/2014108101416933.png?201498101535 [2014108101431319.png_201498101522]: http://files.jb51.net/file_images/article/201410/2014108101431319.png?201498101522 [2014108101441092.png_201498101510]: http://files.jb51.net/file_images/article/201410/2014108101441092.png?201498101510
相关 华为od机试 C++ 【切割字符串】 题目 给定一个由小写字母组成的字符串。请找出两个位置,将字符串分为三部分。这三部分的总和应该是相同的,其中每部分的总和是其字符的ASCII码值的总和。注意,这两个位置的字 ╰+哭是因爲堅強的太久メ/ 2024年03月08日 07:34/ 0 赞/ 83 阅读
相关 vue字符串切割 一、概述 现有一个基于element-ui开发的后台页面,效果如下: ![1be8bf322db2f03eaef7e8d52b79efa7.png][] 需要将公司名 一时失言乱红尘/ 2023年01月12日 04:25/ 0 赞/ 221 阅读
相关 dataframe 字符串切割 问题: 现在手中有一表格,其中一列数据长成下列格式:三个元素挤在一个单元格中,现在需要把这三个元素进行分隔开,生成新的三列,该如何办? ![bac4d4372a63b7b2 ╰+攻爆jí腚メ/ 2022年12月23日 09:58/ 0 赞/ 453 阅读
相关 c++ 字符串切割 include <stdio.h> include<iostream> include<vector> include <algorithm> 约定不等于承诺〃/ 2022年12月10日 10:11/ 0 赞/ 282 阅读
相关 golang:字符串切割 package main import ( "fmt" "strings" ) func main(){ 今天药忘吃喽~/ 2022年09月07日 06:39/ 0 赞/ 331 阅读
相关 CString 字符串切割函数 最近做了个小项目,用到了CString函数的字符串查找和切割!在网上找了一个资料,分享给大家,希望对你有用。 参考资料:http://www.360do 素颜马尾好姑娘i/ 2022年07月14日 15:11/ 0 赞/ 413 阅读
相关 C++切割字符串 转载:本文实例汇总了C++常用字符串分割方法,分享给大家供大家参考。具体分析如下: string str;getline(cin,str);getline函数是遇回车符结束输 深藏阁楼爱情的钟/ 2022年03月28日 10:55/ 0 赞/ 513 阅读
相关 字符串切割 String str1="-1"; String substr1=str1.substring(1); System.out.print 墨蓝/ 2022年03月15日 09:44/ 0 赞/ 467 阅读
相关 js切割字符串 var time\_str= '2019-9-10 13:18:20'; var t = time\_str.substr(2,8); 清疚/ 2021年10月30日 04:18/ 0 赞/ 579 阅读
还没有评论,来说两句吧...