C++中路径的处理方法(string)
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.该搜索在字符末尾查找匹配,所以没有提供起始位置。
示例:
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.
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,函数搜索整个字符串。
示例:
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,则删除到字符串尾部的所有字符。默认情况下,start为0,函数从字符串是起始位置开始删除字符串。默认情况下,函数也删除到字符串尾。需要注意的是,不使用参数调用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
C++中路径的处理方法(string)的更多相关文章
- 关于HTTP请求中更改body中传递的参数方法
更改body中传递的参数方法: String txId = UUID.randomUUID().toString().replaceAll("-", ""); ...
- 关于Integer类中parseInt()和valueOf()方法的区别以及int和String类性的转换.以及String类valueOf()方法
Integer类中的. 关于parseInt()方法的API文档. 返回的是int类型的 关于valueOf()方法的API文档 返回的是Integer类型的. 关于intValue()方法的API ...
- C#中使用Buffer.BlockCopy()方法将string转换为byte array的方法:
public static void BlockCopy(Array src, int srcOffset, Array dst, int dstOffset, int count); 将指定数目的字 ...
- java中得到classpath和当前类的绝对路径的一些方法(路径中的%20"进行替换空格)
原网址:http://blog.csdn.net/shendl/article/details/1427475 (注意:利用下面方式得到路径,如果路径中有空格字符, 那么会有"%20&quo ...
- C# 对包含文件或目录路径信息的 System.String 实例执行操作
在字符串操作中有一类比较特殊的操作,就是对包含文件或目录路径信息的 System.String 实例执行操作.比如根据一个表示路径的字符串获取其代表的文件名称.文件夹路径.文件扩展名等.在很多时候,我 ...
- 解决JSP路径问题的方法(jsp文件开头path, basePath作用)
原文:http://blog.csdn.net/mingxunzh/article/details/4627185 在JSP中的如果使用 "相对路径" 则有可能会出现问题. 因为 ...
- JavaScript Number 对象 Javascript Array对象 Location 对象方法 String对象方法
JavaScript Number 对象 Number 对象属性 属性 描述 constructor 返回对创建此对象的 Number 函数的引用. MAX_VALUE 可表示的最大的数. MIN_V ...
- asp.net中导出Excel的方法
一.asp.net中导出Excel的方法: 本文转载 在asp.net中导出Excel有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上:一种是将文件直接将文件输出 ...
- eWebeditor编辑器上传图片路径错误解决方法[疑难杂症]【转,作者:unvs】
做了一个多版本的网站,后台用的编辑器是eWebeditor,NET版,后面发现上传图片或者文件之后,路径错误无法显示,必须手工修改才行.. 为了更清楚的说明问题,我下面会说的比较详细,首先是网站文件框 ...
随机推荐
- PostgreSQL之Sequence序列(转)
本文转载自:https://blog.csdn.net/omelon1/article/details/78798961 Sequence序列 Sequence是一种自动增加的数字序列,一般作为行或者 ...
- ansible系列7-mysql_user模块
添加mysql的用户和权限.密码 新增mysql用户zhang,设置登录密码zhang,给予权限zabbix.*:ALL ansible dba -m mysql_user -a 'login_hos ...
- Django-website 程序案例系列-4 ORM数据库操作
数据库表的创建: 使用mysql时注意,在setting.py中的设置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql' ...
- AOP 获取 RequestContextHolder
转载: http://blog.csdn.net/lexang1/article/details/52619215 在使用spring时,经常需要在普通类中获取session,request等对像. ...
- Codeforces Round #436 (Div. 2) A,B,D
A. Fair Game 题目链接:http://codeforces.com/contest/864/problem/A 水题 #include<iostream> #include&l ...
- 自学Python1.4-Centos内vim中文乱码问题
自学Python之路 自学Python1.4-Centos内vim中文乱码问题 1. 登陆的系统---区域语言设置 1.1查看安装中文包: 查看系统是否安装中文语言包 (列出所有可用的公共语言环境的名 ...
- 自学Python3.2-函数分类(内置函数)
自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...
- git 28原则
一.流程 $ git init # 创建一个新的仓库 sublime 编写文本,不要使用win自带文本编辑器 $ git add file1 # 将文件添加到暂存区 $ git add file2 $ ...
- C# ADO.NET基础&实战
什么是ADO.NET:数据库访问技术! 作用:通过程序来连接访问数据库! 一.基础: using System.Data.SqlClient; //数据库连接命名空间 string connec ...
- 关于promise的一些用法
Promise,简单说就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.从语法上说,Promise 是一个对象,从它可以获取异步操作的消息. Promise对象有以下两个特点 ...