20170604_string中的函数find_first_of()和 find_last_of()

20170604_string中的函数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(string::nops)。
 
int find_first_of(char c, int start = 0):
    查找字符串中第1个出现的c,由位置start开始。如果有匹配,则返回匹配位置;否则,返回-1。默认情况下,start为0,函数搜索整个字符串。
int find_last_of(char c):
    查找字符串中最后一个出现的c。有匹配,则返回匹配位置;否则返回-1。该搜索在字符末尾查找匹配,所以没有提供起始位置。

string str = "Mississippi";  
 int index;  
 // 's ' 在index 为 2、3、5、6处出现  
 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.
str.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,函数搜索整个字符串。

string fullname = "Mark Tompkin", firstname, lastname;  
int index;  
 
index = fullname.find_last_of(' ');   // index is 4  
// firstname = "Mark" lastname = "Tompkin"  
firstname = fullname.substr(0,index);  
lastname = fullname.substr(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,则删除到字符串尾部的所有字符。

默认情况下,start 为0,函数从字符串是起始位置开始删除字符串。

默认情况下,函数也删除到字符串尾。

需要注意的是,不使用参数调用erase() 函数时,将把字符串截断为长度为0 的空字符串。

 string str = "endfile";  
 string s = "string object type";  
 str += " mark";  // str 是 "endfile 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"

  
#include "stdafx.h"  
#include<iostream>  
#include<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;  
}

输出结果:
Enter the path name: /class/programs/testfile
path:          /class/programs
Filename:    testfile

输出结果:
Enter the path name: programs/strings/filedemp.cpp
path:            programs/strings
Filename:      filedemo.cpp
Executable:   filedemo.exe

输出结果:
Enter the path name:   /program.cpp
path:
Filename:    program.cpp
Executable: program.exe   














评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值