zoukankan      html  css  js  c++  java
  • c++中字符串的截取:

    c++中字符串的截取:

    string 类提供字符串处理函数,利用这些函数,程序员可以在字符串内查找字符,
    提取连续字符序列(称为子串),以及在字符串中删除和添加。我们将介绍一些主要函数。

    1.函数find_first_of()和 find_last_of() 执行简单的模式匹配

        例如:在字符串中查找单个字符c。
    函数find_first_of() 查找在字符串中第1个出现的字符c,而函数find_last_of()查找最后
    一个出现的c。匹配的位置是返回值。如果没有匹配发生,则函数返回-1.
       
              int find_first_of(char c, int start = 0):
                  查找字符串中第1个出现的c,由位置start开始。
                  如果有匹配,则返回匹配位置;否则,返回-1.默认情况下,start为0,函数搜索
                  整个字符串。
                  
              int find_last_of(char c):
                  查找字符串中最后一个出现的c。有匹配,则返回匹配位置;否则返回-1.
                  该搜索在字符末尾查找匹配,所以没有提供起始位置。
         
         示例:
       

    1.  
      string str = "Mississippi";
    2.  
      int index;
    3.  
      // 's ' 在index 为 2、3、5、6处出现
    4.  
      index = str.find_first_of('s',0); // index为 2
    5.  
      index = str.find_first_of('s',4); // index为 5
    6.  
      index = str.find_first_of('s',7); // index为 -1
    7.  
       
    8.  
      // ‘s’的最后出现在 index= 6
    9.  
      index = str.find_last_of('s');
    10.  
      // while 循环输出每个'i'的index
    11.  
      while((index = str.find_first_of('i', index))!= -1)
    12.  
      {
    13.  
      cout << "index" << index << " ";
    14.  
      index++; // restart search at next indx
    15.  
      }


       输出结果: index 1 index 4 index 7 index 10
       

       2.字符串中提取连续字符序列,既子串。

       这个操作假定位置 start 和 字符数 count.
        
        string substr(int start=0,int count= -1);
             从起始位置开始复制字符串中的count 个字符,并返回这些字符作为子串。
          如果字符串尾部小于count字符或者count 为-1,则字符串尾停止复制。
          如果不使用参数调用只包括位置start,则substr()返回从位置开始到字符串尾部的子串。
          
          find()函数在字符串中查找指定模式。该函数将字符串s和位置start作为参数,并查找
          s的匹配作为子串。
          
       int find(const string& s,int start = 0):
           该搜索获得字符串s和位置start,并查找s的匹配作为子串。
           如果有匹配,则返回匹配的位置;否则返回-1。默认情况下,
           start为0,函数搜索整个字符串。
           
        示例  
      

    1.  
      string fullname = "Mark Tompkin", firstname, lastname;
    2.  
      int index;
    3.  
       
    4.  
      index = str.find_last_of(' '); // index is 4
    5.  
      // firstname = "Mark" lastname = "Tompkin"
    6.  
      firstname = fullname.sub string(0,index);
    7.  
      lastname = fullname.substring(index+1);
    8.  
       
    9.  
      index = fullname.find("kin"); // 在 index = 9 匹配 "Kin"
    10.  
      index = fullname.find("omp",0); // 在 index = 6 匹配 "omp"
    11.  
      index = fullname.find("omp",7); // index is -1 (无匹配)

       

        3.添加和删除字符串

            字符连接(+、+=)是在字符串尾添加字符串。insert()函数扩展了这个能力,
        允许在任意位置添加字符串。为了从字符串。为了从字符串中删除字符串,
        函数erase()可以从指定的位置开始删除字符。
        
        void insert(int statr,const string& s):
                   将子串s放入字符串中,起始于位置start。插入操作增加了原始字符串的长度。
         
         void erase(int start=0,int count=-1):
                    从start开始,从字符串中删除count个字符。如果现有的字符串少于count个
         字符,或者count为-1,则删除到字符串尾部的所有字符。默认情况下,start为0,函数
         从字符串是起始位置开始删除字符串。默认情况下,函数也删除到字符串尾。
         需要注意的是,不使用参数调用erase()函数时,将把字符串截断为长度为0的空字符串。
         
         示例:
       

    1.  
      string str = "endfile";
    2.  
      string s = "string object type";
    3.  
      str += " mark";
    4.  
      str.inset(3, "-of-"); // str 是 "end-of-file mark"
    5.  
      s.erase(7,7); // s 是 "string type"
    6.  
      // 从index 为3处删除4个字符
    7.  
      s.erase(3,4);
    8.  
      cout << s; // 输出:"strtype"

         

        4.c_str()返回c语言风格字符串的地址。

         将字符串对象转换为c语言风格字符串。
         char *c_str();
             返回一个等价于字符串对象的c语言风格字符串的地址。返回类型char*表示c
             语言风格字符串第1个字符的地址。
             
           示例:       

    1.  
      string filename = "input.dat";
    2.  
      // open 要求文件名是c语言风格的字符串
    3.  
      fin.open(filename.c_str());

       5.分离字符串路径的方法

          处理文件的程序可能要分析文件名。这种算法要进行字符串处理。文件可以
          由路径名指定,路径名包括由分隔符"/"分割的名称集。最后一个"/"前的名称序列
          称为路径。最后一个名称是文件名,还可能包括扩展名。
          
          路径名    /class/programs/testfile.cpp
          路径        /class/programs/
          文件名     testfile.cpp
          扩展名     cpp
          
          为了分析文件名,我们从键盘读入完整的路径名,并输出路径和文件名。
          如果文件名具有扩展名"cpp",则在创建可执行文件名时,将用"exe"替代扩展名"cpp".
          下面是程序结构的轮廓,以及如何使用字符串函数的说明:
          
          1.输入文件名,使用函数find_last_of()在字符串中搜索最后一个出现的"/"。这个字符
          确定了路径的结尾和文件名的开始。
          2。路径是由最后一个"/"前所有字符串组成的子串。文件名是最后一个"/"后的
            所有字符。使用最后一个"/"的位置和substr()提取出路径和文件名。
          3.扩展名是文件名中最好一个"."后的字符串。调用find_last_of()搜索最后一个匹配,
          则复制文件名,删除当前扩展名,并添加新的扩展名"exe"。 输出产生的可执行文件名。
          
          // 文件prg1_3.cpp
          // 此程序提示用户输入文件的路径
          // 它使用string类操作来识别并输出
          // 路径名和文件名。如果文件名有
          // 扩展名"cpp",则创建并输出
          // 可执行文件的名称,其扩展名为"exe",替换
          // 扩展名"cpp"
         

    1.  
      // WJ.cpp : 定义控制台应用程序的入口点。
    2.  
      //
    3.  
      #i nclude "stdafx.h"
    4.  
      #i nclude<iostream>
    5.  
      #i nclude<string>
    6.  
       
    7.  
      using namespace std;
    8.  
       
    9.  
      int main()
    10.  
      {
    11.  
      string pathname, path, filename,executableFile;
    12.  
      // ‘/’和 '.'的位置
    13.  
      int backslashIndex, dotIndex;
    14.  
      cout << "Enter the path name: ";
    15.  
      cin >> pathname;
    16.  
       
    17.  
      // 识别最后一个'/'的位置。注意:由于
    18.  
      // 转义码如'/n'以/起始,
    19.  
      // c++ 使用'//'表示 /
    20.  
       
    21.  
      backslashIndex = pathname.find_last_of('//');
    22.  
       
    23.  
      //路径名是最后一个'/'之前的字符
    24.  
      path = pathname.substr(0,backslashIndex);
    25.  
       
    26.  
      cout << "path: " << path << endl;
    27.  
       
    28.  
      // 路径名尾部是文件名
    29.  
      filename = pathname.substr(backslashIndex+1,-1);
    30.  
      cout << "Filename: " << filename << endl;
    31.  
       
    32.  
      // 查看文件名是否有'.cpp'扩展名。
    33.  
      // 首先找到最后一个'.'的位置。 如果
    34.  
      // 没有'.',则dotIndex为-1
    35.  
      dotIndex = filename.find_last_of('.');
    36.  
      //测试是否有'.',其余的字符是否为"cpp"
    37.  
      if (dotIndex != -1 && filename.substr(dotIndex+1) == "cpp")
    38.  
      {
    39.  
      // 删除"cpp",并加上"exe"设置可执行字符串
    40.  
      executableFile = filename;
    41.  
      executableFile.erase(dotIndex+1,3);
    42.  
      executableFile+="exe";
    43.  
      cout << "Executable: " << executableFile << endl;
    44.  
      }
    45.  
       
    46.  
      return 0;
    47.  
      }


       输出结果:
       第1次允许结果:
       
       Enter the path name: /class/programs/testfile
       path:          /class/programs
       Filename:    testfile
       
       第2次允许结果:
       
       Enter the path name: programs/strings/filedemp.cpp
       path:            programs/strings
       Filename:      filedemo.cpp
       Executable:   filedemo.exe
       
       第3次允许结果:
       
       Enter the path name:   /program.cpp
       path:
       Filename:    program.cpp
       Executable: program.exe

    from:https://blog.csdn.net/zhenyusoso/article/details/7286456

  • 相关阅读:
    POJ2559/HDU1506 Largest Rectangle in a Histogram (cartesian tree)
    POJ2201 Cartesian Tree (cartesian tree)
    一本通1007
    一本通1006
    一本通1005
    一本通1004
    一本通1003
    一本通1002
    一本通1001
    一本通1000
  • 原文地址:https://www.cnblogs.com/zhangzl/p/9870410.html
Copyright © 2011-2022 走看看