string 類提供字串處理函式,利用這些函式,程式設計師可以在字串內查詢字元,
提取連續字串行(稱為子串),以及在字串中刪除和新增。我們將介紹一些主要函式。
標頭檔案:
#include
using namespace std;
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)
輸出結果: 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.substring(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 : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include
#include
using namespace std;
int main()
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
string中若干函式的理解
由於學識有限,所以顯得積累的重要性。標準庫中string的find以及resize的理解。size type find const basic string str,size type index 從index開始查詢str size type find const char str,size ty...
專案優化的若干方法
近期經常聽到現場人員和測試人員反映我們的專案訪問時間長,頁面響應速度比較慢。一直想對這個問題進行跟蹤處理。趁現在時間較少時做了些許試驗,有以下結論 1.專案中大量使用了js,並封裝了大量的js控制項,每個頁面需要引入的js檔案一般在30個左右,這種過多的js檔案引入會影響頁面響應速度。2.專案中使用...
素數的若干求解方法
最直觀的方法,根據定義,因為質數除了1和本身之外沒有其他約數,所以判斷n是否為質數,根據定義直接判斷從2到n 1是否存在n的約數即可。c 如下 cpp view plain copy bool isprime 1 intnum 上述判斷方法,明顯存在效率極低的問題。對於每個數n,其實並不需要從2判斷...