find_first_of()和 find_last_of() 【获取路径、文件名】

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.默认情况下,start0,函数搜索整个字符串。
        
          int find_last_of(char c):
             
 查找字符串中最后一个出现的c。有匹配,则返回匹配位置;否则返回-1.该搜索在字符末尾查找匹配,所以没有提供起始位置。
    
    
 示例:
     string str = "Mississippi";
     int index;
     // 's '
 在index 为 2356处出现
     index = str.find_first_of('s',0);    // index
为 2
     index = str.find_first_of('s',4);    // index
为 5
     index = str.find_first_of('s',7);    // index
为 -1
    
     // ‘s’
的最后出现在 index= 6
     index = str.find_last_of('s');
     // while
 循环输出每个'i'index
     while((index = str.find_first_of('i', index))!= -1)
     {
        cout << "index" << index << " ";
        index++;   // restart search at next indx
     }
    
  
 输出结果: 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。                                                                       默认情况下,start0,函数搜索整个字符串。
      
   
 示例:
    string fullname = "Mark Tompkin", firstname, lastname;
    int index;
   
    index = str.find_last_of(' ');   // index is 4
    // firstname = "Mark" lastname = "Tompkin"
    firstname = fullname.sub string(0,index);
    lastname = fullname.substring(index+1);
   
    index = fullname.find("kin");         //
 在 index = 9 匹配 "Kin"
    index = fullname.find("omp",0);    //
 在 index = 6 匹配 "omp"
    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,则删除到字符串尾部的所有字符。默认情况下,start0,函数从字符串是起始位置开始删除字符串。默认情况下,函数也删除到字符串尾。需要注意的是,不使用参数调用erase()函数时,将把字符串截断为长度为0的空字符串。
    
    
 示例:
     string str = "endfile";
     string s = "string object type";
     str += " mark";
     str.inset(3,   "-of-"); // str
 是 "end-of-file mark"
     s.erase(7,7);        // s
 是 "string type"
     //
 从index 为3处删除4个字符
     s.erase(3,4);
     cout << s;          //
 输出:"strtype"
    
    4.c_str()
返回c语言风格字符串的地址。
    
 将字符串对象转换为c语言风格字符串。
     char *c_str();
        
 返回一个等价于字符串对象的c语言风格字符串的地址。返回类型char*表示c语言风格字符串第1个字符的地址。
        
      
 示例:
         string filename = "input.dat";
         // open
 要求文件名是c语言风格的字符串
         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"
     
// WJ.cpp :
 定义控制台应用程序的入口点。
//
i nclude "stdafx.h"
i nclude<iostream>
i nclude<string>

using namespace std;

int main()
{
string pathname, path, filename,executableFile;
// ‘\’
和 '.'的位置
int backslashIndex, dotIndex;
cout << "Enter the path name: ";
cin >> pathname;

// 识别最后一个'\'的位置。注意:由于
//
 转义码如'\n'\起始,
// c++
 使用'\\'表示 \

backslashIndex = pathname.find_last_of('\\');

//路径名是最后一个'\'之前的字符
path = pathname.substr(0,backslashIndex);

cout << "path:     " << path << endl;

// 路径名尾部是文件名
filename = pathname.substr(backslashIndex+1,-1);
cout << "Filename: " << filename << endl;

// 查看文件名是否有'.cpp'扩展名。
//
 首先找到最后一个'.'的位置。 如果
//
 没有'.',则dotIndex-1
dotIndex = filename.find_last_of('.');
//
测试是否有'.',其余的字符是否为"cpp"
if (dotIndex != -1 && filename.substr(dotIndex+1) == "cpp")
{
   //
 删除"cpp",并加上"exe"设置可执行字符串
   executableFile = filename;
   executableFile.erase(dotIndex+1,3);
   executableFile+="exe";
   cout << "Executable: " << executableFile << endl;
}

return 0;
     
  
 输出结果:
  
 第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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/458650.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

支付宝集成

memo Error Domain系统繁忙&#xff0c;请稍后再试 Code1000 "(null)" reslut {memo "Error Domain\U7cfb\U7edf\U7e41\U5fd9\Uff0c\U8bf7\U7a0d\U540e\U518d\U8bd5 Code1000 \"(null)\"";result "";resultStatus 4000;} 请问安装…

servlet中实现页面跳转return “r:”和return “f:

servlet中实现页面跳转return “r&#xff1a;”和return “f&#xff1a;”的区别和作用 分享| 2015-07-28 14:22741830480 | 浏览 48 次Pascal2015-07-28 14:26 #知道行家专业创造价值&#xff0c;火热招募中&#xff01;#提问者采纳热心网友r是redirect重定向&#xff0c;参…

多线程编程 RW_LOCK 读写锁

RW锁 读写锁&#xff0c;也叫共享独占锁 互斥量 要么是锁住状态&#xff0c;要么是不加锁状态&#xff0c;而且一次只有一个线程可以对其加锁。 读写锁可以有三种状态&#xff0c;读模式下加锁状态&#xff0c;写模式下加锁状态&#xff0c;不加锁状态。一次只有一个线程可以占…

Error Domain=NSCocoaErrorDomain Code=3840 JSON text did not start with array or object and option

数据请求失败 报错 Error DomainNSCocoaErrorDomain Code3840 "JSON text did not start with array or object and option to allow fragments not set." UserInfo{NSDebugDescriptionJSON text did not start with array or object and option to allow fragm…

vim学习笔记(4)帮助与配置

使用帮助 在Vim中输入命令&#xff1a;help&#xff0c;即可进入帮助界面&#xff0c;默认是英文&#xff0c;可以通过以下方式安装中文帮助&#xff08;以vimcdoc-1.9.0为例&#xff09;&#xff1a; 1、下载中文帮助的文件压缩包 2、解压 tar -xzvf vimcdoc-1.9.0.tar.gz 3、…

C语言程序代码优化

我认为一个好的用于科学计算的程序代码应该&#xff1a;算法漂亮精妙&#xff0c;程序简洁易懂&#xff0c;运算快速&#xff0c;节省内存。这里有的地方是矛盾的&#xff0c;比如简洁vs易懂&#xff0c;时间vs空间&#xff0c;找个平衡吧。目前来看时间要比空间宝贵一些。写程…

微信支付不回调支付成功的方法,这是为什么

如果你是Xcode7.2&#xff0c;或者IOS9.2的话&#xff0c;可能会遇见在微信客户端操作返回程序之后不能执行微信的onResp回调方法的问题&#xff0c;就是因为一下这两个方法被废弃掉了&#xff0c;所以我的新demo替换了一个新的方法在下面。就完美解决这个问题了&#xff08;并…

如何在苹果官网下载旧版本的Xcode 方法

1 在百度里输入“苹果开发者中心“&#xff0c;进入以下页面。点击页面中的“Member Center" 2 出现登录界面。这是需要苹果开发者帐号的&#xff0c;没有帐号的可以选择“Create Apple ID”进行注册。已经注册的选择“Sign In"登录 3 页面跳转后&#xff0c;选择…

屏幕尺寸 分辨率

1、分辨率 分辨率又称显示分辨率、屏幕分辨率 确定手机屏幕上显示多少信息的设置&#xff0c;以水平和垂直像素来衡量 6 750 *1334 像素 5s 640 * 1136 像素 2、屏幕尺寸 屏幕大小的物理尺寸&#xff0c;以屏幕对角线长度衡量 单位&#xff1a;英寸 1英寸2.54厘米 6 4.7英…

程序代码优化2

程序进行优化&#xff0c;通常是指优化程序代码或程序执行速度。优化代码和优化速度实际上是一个予盾的统一&#xff0c;一般是优化了代码的尺寸&#xff0c;就会带来执行时间的增加&#xff0c;如果优化了程序的执行速度&#xff0c;通常会带来代码增加的副作用&#xff0c;很…

【转】android多分辨率适配

前一阶段开发android项目&#xff0c;由于客户要求进行多分辨率适配&#xff0c;能够支持国内主流的分辨率手机。因此经过了几次开发走了很多弯路&#xff0c;目前刚刚领略了android多分辨率适配的一些方法。 先介绍一下所走的弯路&#xff0c;由于android的布局文件存放在res的…

TCP/IP SOCKET HTTP及HTTPS之间的关系

GET跟POST的区别&#xff1a; get只能传送128K的数据 而post是无限制的 post提交是不在会IE上带上参数 就算你加密了别人也会解密 一般比较重要的数据通过post 传&#xff0c;因为get是别人可以改参数值的 别人乱写参数&#xff0c;你的异常报个不停 网络七层由下往上分别为物理…

静态链接与动态链接的区别

动态链接库、静态库、import库区别 动态链接库(Dynamic Linked Library)&#xff1a; Windows为应用程序提供了丰富的函数调用&#xff0c;这些函数调用都包含在动态链接库中。其中有3个最重要的DLL&#xff0c;Kernel32.dll&#xff0c;它包含用于管理内存、进程和线程的各个函…

Java线程池介绍

根据摩尔定律&#xff08;Moore’s law&#xff09;&#xff0c;集成电路晶体管的数量差不多每两年就会翻一倍。但是晶体管数量指数级的增长不一定会导致 CPU 性能的指数级增长。处理器制造商花了很多年来提高时钟频率和指令并行。在新一代的处理器上&#xff0c;单线程程序的执…

curl -L get.rvm.io | bash -s stable报错:连接不上服务器

1、安装cocoa pods时&#xff0c; ERROR: Error installing cocoa: activesupport requires Ruby version > 2.2.2. 这个错误是说&#xff1a;rvm的版本过低&#xff0c;需要升级一下版本 2、升级rvm版本的时候&#xff0c;报标题的错误解决办法如下 将上面的命令行改成&a…

C语言中#define的用法(转)

转自&#xff1a;http://www.dingge.com/main/article.asp?id10 今天整理了一些#define的用法&#xff0c;与大家共享&#xff01; 1.简单的define定义 #define MAXTIME 1000 一个简单的MAXTIME就定义好了&#xff0c;它代表1000&#xff0c;如果在程序里面写 if(i<MAXTIM…

cocoa pods的安装与我遇到的问题

1.打开终端 终端输入 ruby -v 查看ruby的版本 打印代码&#xff1a; ruby 2.0.0p648 (2015-12-16 revision 53162) [universal.x86_64-darwin15] 2. 更换ruby镜像 终端输入如下命令&#xff08;把Ruby镜像指向taobao&#xff0c;避免被墙&#xff0c;你懂得&#xff09; a.移…

Node 连接Mysql并进行增删改查

NPM: NPM的全称是Node Package Manager&#xff0c;类似于ruby的gem&#xff0c;Python的PyPL、setuptools&#xff0c;PHP的pear&#xff0c;是Nodejs中的包管理器。Nodejs自身提供了基本的模块。但是在这些基本模块上开发实际应用需要较多的工作。NPM上已经有近万个Nodejs库或…

C++/C 宏定义(define)中# ## 的含义(转)

参考&#xff1a;http://www.cnblogs.com/little-ant/p/3463080.html http://hi.baidu.com/kiraversace/item/1148ee057147981a4ac4a3e9 C/C 宏定义&#xff08;define&#xff09;中# ## 的含义 define 中的# ## 一般是用来拼接字符串的&#xff0c;但是实际使用过程中&#x…

Implicit declaration of function 'NSFileTypeForHFSTypeCode' is invalid in C99

一般出现该问题是因为通过C调用了unix/linux 底层接口&#xff0c;所以需要调整c语言的编译选项&#xff0c;设置方法见下图&#xff1a;(根据实际情况选择相应的编译选项)