zoukankan      html  css  js  c++  java
  • (转)C++常见问题: 字符串分割函数 split

    http://www.cnblogs.com/dfcao/p/cpp-FAQ-split.html

    C++标准库里面没有字符分割函数split ,这可太不方便了,我已经遇到>3次如何对字符串快速分割这个问题了。列几个常用方法以备不时之需。

    方法一: 利用STL自己实现split 函数(常用,简单,直观)

    原型: vector<string> split(const string &s, const string &seperator);

    输入一个字符串,一个分隔符字符串(可包含多个分隔符),返回一个字符串向量。这是我最喜欢的方法,因为它最直观,在平常也最常用。实现及测试代码如下

    #include <vector>
    #include <string>
    #include <iostream>
    using namespace std;
    
    vector<string> split(const string &s, const string &seperator){
      vector<string> result;
      typedef string::size_type string_size;
      string_size i = 0;
      
      while(i != s.size()){
        //找到字符串中首个不等于分隔符的字母;
        int flag = 0;
        while(i != s.size() && flag == 0){
          flag = 1;
          for(string_size x = 0; x < seperator.size(); ++x)
          if(s[i] == seperator[x]){
            ++i;
            flag = 0;
            break;
          }
        }
        
        //找到又一个分隔符,将两个分隔符之间的字符串取出;
        flag = 0;
        string_size j = i;
        while(j != s.size() && flag == 0){
          for(string_size x = 0; x < seperator.size(); ++x)
          if(s[j] == seperator[x]){
            flag = 1;
            break;
          }
          if(flag == 0) 
          ++j;
        }
        if(i != j){
          result.push_back(s.substr(i, j-i));
          i = j;
        }
      }
      return result;
    }
    
    int main(){
      string s = "a,b*c*d,e";
      vector<string> v = split(s, ",*"); //可按多个字符来分隔;
      for(vector<string>::size_type i = 0; i != v.size(); ++i)
        cout << v[i] << " ";
      cout << endl;
      //输出: a b c d
    }

    提供了一段更简洁高效的代码,实现如下:

    void SplitString(const std::string& s, std::vector<std::string>& v, const std::string& c)
    {
      std::string::size_type pos1, pos2;
      pos2 = s.find(c);
      pos1 = 0;
      while(std::string::npos != pos2)
      {
        v.push_back(s.substr(pos1, pos2-pos1));
     
        pos1 = pos2 + c.size();
        pos2 = s.find(c, pos1);
      }
      if(pos1 != s.length())
        v.push_back(s.substr(pos1));
    }

    方法二: 用C语言中的strtok 函数来进行分割

    原型:  char *strtok(char *str, const char *delim);

    strtok函数包含在头文件<string.h>中,对于字符数组可以采用这种方法处理。当然也可以将字符数组转换成字符串之后再使用法一。测试代码如下

    #include <string.h>
    #include <stdio.h>
    
    int main(){
      char s[] = "a,b*c,d";
      const char *sep = ",*"; //可按多个字符来分割
      char *p;
      p = strtok(s, sep);
      while(p){
        printf("%s ", p);
        p = strtok(NULL, sep);
      }
      printf("
    ");
      return 0;
    }
    //输出: a b c d

    浅谈c++中map插入数据的用法

    map:数据的插入

    在构造map容器后,我们就可以往里面插入数据了。这里讲三种插入数据的方法:
    第一种:用insert函数插入pair数据
     map<int, string> mapStudent;
     mapStudent.insert(pair<int, string>(1,“student_one”));
    第二种:用insert函数插入value_type数据
    map<int, string> mapStudent;
    mapStudent.insert(map<int, string>::value_type (1,"student_one"));
    mapStudent.insert(make_pair(1, "student_one"));
       
    第三种:用数组方式插入数据
    map<int, string> mapStudent;
    mapStudent[1] = “student_one”;
    mapStudent[2] = “student_two”;

    以上三种用法,虽然都可以实现数据的插入,但是它们是有区别的,当然了第一种和第二种在效果上是完成一样的,用insert函数插入数据,在数据的插入上涉及到集合的唯一性这个概念,即当map中有这个关键字时,insert操作是不能再插入这个数据的,但是用数组方式就不同了,它可以覆盖以前该关键字对应的值,即:如果当前存在该关键字,则覆盖改关键字的值,否则,以改关键字新建一个key—value;

    笔试题代码:

    #include<iostream>
    #include<string>
    #include<vector>
    #include<map>
    using namespace std;
    
    
    
    #define HTTP_HEADER  
        "GET /index.html  HTTP/1.1.
    "    
        "Content-Type :text
    "      
        "Host:web
    "  
        "Accept:text/thml
    " 
        "Accept-Encoding:identifty
    " 
        "User-Agent:Morzilla
    "  
        "
    "
    
    
    vector<string> split(const string &s, const string &seperator){
        vector<string> result;
        typedef string::size_type string_size;
        string_size i = 0;
    
        while (i != s.size()){
            //找到字符串中首个不等于分隔符的字母;
            int flag = 0;
            while (i != s.size() && flag == 0){
                flag = 1;
                for (string_size x = 0; x < seperator.size(); ++x)
                    if (s[i] == seperator[x]){
                        ++i;
                        flag = 0;
                        break;
                    }
            }
    
            //找到又一个分隔符,将两个分隔符之间的字符串取出;
            flag = 0;
            string_size j = i;
            while (j != s.size() && flag == 0){
                for (string_size x = 0; x < seperator.size(); ++x)
                    if (s[j] == seperator[x]){
                        flag = 1;
                        break;
                    }
                if (flag == 0)
                    ++j;
            }
            if (i != j){
                result.push_back(s.substr(i, j - i));
                i = j;
            }
        }
        return result;
    }
    
    
    void SplitString(const std::string& s, std::vector<std::string>& v, const std::string& c)
    {
        std::string::size_type pos1, pos2;
        pos2 = s.find(c);
        pos1 = 0;
        while (std::string::npos != pos2)
        {
            v.push_back(s.substr(pos1, pos2 - pos1));
    
            pos1 = pos2 + c.size();
            pos2 = s.find(c, pos1);
        }
        if (pos1 != s.length())
            v.push_back(s.substr(pos1));
    }
    
    int main(){
        
    
        map<string, string> headers;
        string str = HTTP_HEADER;
        cout << str << endl;
        vector<string> v = split(str, "
    "); //可按多个字符来分隔;
    
        string str0Line = v[0];
        string str1Line = v[1];
        string str2Line = v[2];
        string str3Line = v[3];
        string str4Line = v[4];
        string str5Line = v[5];
    
        cout << str0Line << endl;
        cout << str1Line << endl; cout << str2Line << endl; cout << str3Line << endl; cout << str4Line << endl; cout << str5Line << endl; 
    
    
        vector<string> v1 = split(str0Line, " "); //可按多个字符来分隔;
        string str00Line = v1[0];
        string str01Line = v1[1];
        string str02Line = v1[2];
        cout << str00Line << endl;
        cout << str01Line << endl;
        cout << str02Line << endl;
    
    
        for (vector<string>::size_type i = 1; i != v.size(); ++i)
        {
            vector<string> v2 = split(v[i], ":"); //可按:字符来分隔;
            string str10Line = v2[0];
            string str11Line = v2[1];
            
            headers.insert(pair<string, string>(str10Line, str11Line));
            cout << str10Line << " " << str11Line << endl;
        }
    
    
        
        getchar(); getchar();
        return 0;
    }
    View Code
  • 相关阅读:
    解析ASP.NET Mvc开发之EF延迟加载 分类: ASP.NET 2014-01-04 01:29 4017人阅读 评论(1) 收藏
    解析ASP.NET Mvc开发之查询数据实例 分类: ASP.NET 2014-01-02 01:27 5788人阅读 评论(3) 收藏
    解析ASP.NET Mvc开发之查询数据实例
    从明源动力到创新工场这一路走来
    从明源动力到创新工场这一路走来 分类: 程序人生 2013-12-29 07:37 2532人阅读 评论(2) 收藏
    解析ASP.NET WebForm和Mvc开发的区别 分类: ASP.NET 2013-12-29 01:59 11738人阅读 评论(5) 收藏
    解析ASP.NET WebForm和Mvc开发的区别
    MySQL--索引
    MySQL--存储过程
    MySQL--自定义函数
  • 原文地址:https://www.cnblogs.com/shuqingstudy/p/9622793.html
Copyright © 2011-2022 走看看