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.pswp.cn/news/458650.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458650.shtml
英文地址,請注明出處:http://en.pswp.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;(根據實際情況選擇相應的編譯選項)