1/46 物件導向的字串處理 內建的完整類別 string 具有豐富的 成員函數,能以物件導向的語法處 理字串,讓程式設計者免除空間安 排及安插結尾符號等瑣碎的工作。 內建的完整類別 string 具有豐富的 成員函數,能以物件導向的語法處 理字串,讓程式設計者免除空間安 排及安插結尾符號等瑣碎的工作。

Slides:



Advertisements
Similar presentations
FCU, Department of ECE, IC Design Research Lab. TEL: # 4945 Pre-SIm , Post-Sim.
Advertisements

1 生物計算期末作業 暨南大學資訊工程系 2003/05/13. 2 compare f1 f2  只比較兩個檔案 f1 與 f2 ,比完後將結果輸出。 compare directory  以兩兩比對的方式,比對一個目錄下所有檔案的相 似程度。  將相似度很高的檔案做成報表輸出,報表中至少要.
Divide-and-Conquer. 什麼是 divide-and-conquer ? Divide 就是把問題分割 Conquer 則是把答案結合起來.
6-1 指標簡介 6-2 指標與陣列 6-3 動態配置記憶體 6-4 本章綜合練習
布林代數的應用--- 全及項(最小項)和全或項(最大項)展開式
學習C++的基本語法 認識關鍵字與識別字的不同 學習程式碼偵錯的流程 學習如何提高程式的可讀性
: A-Sequence 星級 : ★★☆☆☆ 題組: Online-judge.uva.es PROBLEM SET Volume CIX 題號: Problem D : A-Sequence 解題者:薛祖淵 解題日期: 2006 年 2 月 21 日 題意:一開始先輸入一個.
:Word Morphing ★★☆☆☆ 題組: Problem Set Archive with Online Judge 題號: 10508:word morphing 解題者:楊家豪 解題日期: 2006 年 5 月 21 日 題意: 第一行給你兩個正整數, 第一個代表下面會出現幾個字串,
“Rule” By OX. By Check CREATE TABLE 員工薪資 ( 編號 int IDENTITY PRIMARY KEY, 薪資 smallmoney, CHECK ( 薪資 > 0 AND 薪資
Reference, primitive, call by XXX 必也正名乎 誌謝 : 部份文字取於前輩 TAHO 的文章.
如何將數字變成可用之資訊 現代化資料處理與應用概念. 如何將數字變成可用之資訊 人最容易接受的訊息是圖像化資訊。 在一堆數字中,要進行比較分析,一般會使用表格形 式計算與分析。 所以一般我們會將數字依關聯性, 轉換成表格計算與分析。 此表格一般稱試算表或稱表格。 再將結果轉換為圖表,進行比較與分析。
指導教授:陳淑媛 學生:李宗叡 李卿輔.  利用下列三種方法 (Edge Detection 、 Local Binary Pattern 、 Structured Local Edge Pattern) 來判斷是否為場景變換,以方便使用者來 找出所要的片段。
1 Web of Science 利用指引 單元二 瀏覽與處理查詢結果. 2 瀏覽檢索結果 查出的結果,預設以時間排列, 使用者可改變結果的排列方式: 還可以依被引用次數、相關度、 第一作者、刊名、出版年等排序 回到前先查的結果畫面 點選想看資料的完整書目 本館訂購範圍的期刊 全文,便可直接連結.
:New Land ★★★★☆ 題組: Problem Set Archive with Online Judge 題號: 11871: New Land 解題者:施博修 解題日期: 2011 年 6 月 8 日 題意:國王有一個懶兒子,為了勞動兒子,他想了一個 辦法,令他在某天早上開始走路,直到太陽下山前,靠.
: OPENING DOORS ? 題組: Problem Set Archive with Online Judge 題號: 10606: OPENING DOORS 解題者:侯沛彣 解題日期: 2006 年 6 月 11 日 題意: - 某間學校有 N 個學生,每個學生都有自己的衣物櫃.
第一章 變數、常數及資料型態. 變數 C 程式語言的變數名稱 第一個字必須是英文字母或底線 (_) 之後可以是數字, 英文字母或底線 (_) 不可以是保留字 例: Num (Ο) _score (Ο) C&C (X) 8num (X)
: ShellSort ★★☆☆☆ 題組: Problem D 題號: 10152: ShellSort 解題者:林一帆 解題日期: 2006 年 4 月 10 日 題意:烏龜王國的烏龜總是一隻一隻疊在一起。唯一改變烏龜位置 的方法為:一隻烏龜爬出他原來的位置,然後往上爬到最上方。給 你一堆烏龜原來排列的順序,以及我們想要的烏龜的排列順序,你.
1. 假設以下的敘述為一未提供 “ 捷徑計算 ” 能力的程式段,試用程 式設計的技巧,使此敘述經此改 寫的動作後,具有與 “ 捷徑計算 ” 之 處理方法相同之處理模式。 if and then E1 else E2 endif.
JAVA 程式設計與資料結構 第十四章 Linked List. Introduction Linked List 的結構就是將物件排成一列, 有點像是 Array ,但是我們卻無法直接經 由 index 得到其中的物件 在 Linked List 中,每一個點我們稱之為 node ,第一個 node.
MATLAB 程式設計 第 11 章 多維陣列 多維陣列的定義 在 MATLAB 的資料型態中,向量可視為 一維陣列,矩陣可視二維陣列,對於維 度 (Dimensions) 超過 1 的陣列則均可視 為「多維陣列」 (Multidimesional Arrays , 簡稱 N-D Arrays)
第 18 章 名稱空間與例外處理 18-1 名稱空間 18-1 名稱空間 18-2 例外處理 18-2 例外處理.
第三章 變數與繫結 陳維魁 博士 儒林圖書公司. 2 大綱  變數的定義  變數元件  儲存區配置問題  參考的透明性  完全計算  捷徑計算  繫結 (binding)  繫結時間  精選習題.
8.1 何謂高度平衡二元搜尋樹 8.2 高度平衡二元搜尋樹的加入 8.3 高度平衡二元搜尋樹的刪除
: The Playboy Chimp ★★☆☆☆ 題組: Problem Set Archive with Online Judge 題號: 10611: The Playboy Chimp 解題者:蔡昇宇 解題日期: 2010 年 2 月 28 日 題意:給一已排序的數列 S( 升冪.
JAVA 程式設計與資料結構 第十章 GUI Introdution III. File Chooser  File Chooser 是一個選擇檔案的圖形介面, 無論我們是要存檔還是要開啟檔案,使 用這個物件都會讓我們覺得容易且舒適。
長訊科技 EVRCOM Voice Mail System 使用者操作說明及流程. 自動總機 -- 來電語音轉接服務流程 ( 範例流程 )
Introduction to Java Programming Lecture 5: Using Java Classes : String & Math Spring 2009.
第 1 章 PC 的基本構造. 本章提要 PC 系統簡介 80x86 系列 CPU 及其暫存器群 記憶體: Memory 80x86 的分節式記憶體管理 80x86 的 I/O 結構 學習組合語言的基本工具.
Chapter 13 塑模靜態觀點:物件圖 Static View : Object Diagram.
Introduction to Java Programming Lecture 17 Abstract Classes & Interfaces.
24-6 設定開始與結束場景中的 程式 最後我們要替這個遊戲收個尾, 幫它把開始 的等待畫面跟結束畫面處理一下。
: The largest Clique ★★★★☆ 題組: Contest Archive with Online Judge 題號: 11324: The largest Clique 解題者:李重儀 解題日期: 2008 年 11 月 24 日 題意: 簡單來說,給你一個 directed.
最新計算機概論 第 5 章 系統程式. 5-1 系統程式的類型 作業系統 (OS) : 介於電腦硬體與 應用軟體之間的 程式,除了提供 執行應用軟體的 環境,還負責分 配系統資源。
7 陣列與搜尋 7.1 陣列 一般資料變數 宣告一維陣列 起始一維陣列 7-4
: Happy Number ★ ? 題組: Problem Set Archive with Online Judge 題號: 10591: Happy Number 解題者:陳瀅文 解題日期: 2006 年 6 月 6 日 題意:判斷一個正整數 N 是否為 Happy Number.
: Fast and Easy Data Compressor ★★☆☆☆ 題組: Problem Set Archive with Online Judge 題號: 10043: Fast and Easy Data Compressor 解題者:葉貫中 解題日期: 2007 年 3.
第三章 自動再裝載運用篇 使用時機:裝載計劃完成時,尚有剩餘空 間的情形,維持已固定計劃而繼續做裝載 最佳化。以支持次日裝載計劃而提前調整 作業模式。 裝載物品設定和裝載容器設定如前兩章介 紹,於此不再重複此動作,直接從裝載計 劃設定開始,直接從系統內定的物品和容 器選取所需.
: Ahoy, Pirates! ★★★★☆ 題組: Contest Archive with Online Judge 題號: 11402: Ahoy, Pirates! 解題者:李重儀 解題日期: 2008 年 8 月 26 日 題意:有一個海盜島有 N 個海盜,他們的編號 (id)
: Multisets and Sequences ★★★★☆ 題組: Problem Set Archive with Online Judge 題號: 11023: Multisets and Sequences 解題者:葉貫中 解題日期: 2007 年 4 月 24 日 題意:在這個題目中,我們要定義.
:Nuts for nuts..Nuts for nuts.. ★★★★☆ 題組: Problem Set Archive with Online Judge 題號: 10944:Nuts for nuts.. 解題者:楊家豪 解題日期: 2006 年 2 月 題意: 給定兩個正整數 x,y.
資料結構實習-一 參數傳遞.
6-2 認識元件庫與內建元件庫 Flash 的元件庫分兩種, 一種是每個動畫專 屬的元件庫 (Library) ;另一種則是內建元 件庫 (Common Libraries), 兩者皆可透過 『視窗』功能表來開啟, 以下即為您說明。
1 Introduction to Java Programming Lecture 2: Basics of Java Programming Spring 2008.
: Beautiful Numbers ★★★★☆ 題組: Problem Set Archive with Online Judge 題號: 11472: Beautiful Numbers 解題者:邱經達 解題日期: 2011 年 5 月 5 日 題意: 若一個 N 進位的數用到該.
Section 4.2 Probability Models 機率模式. 由實驗看機率 實驗前先列出所有可能的實驗結果。 – 擲銅板:正面或反面。 – 擲骰子: 1~6 點。 – 擲骰子兩顆: (1,1),(1,2),(1,3),… 等 36 種。 決定每一個可能的實驗結果發生機率。 – 實驗後所有的實驗結果整理得到。
JAVA 程式設計與資料結構 第二十章 Searching. Sequential Searching Sequential Searching 是最簡單的一種搜尋法,此演 算法可應用在 Array 或是 Linked List 此等資料結構。 Sequential Searching 的 worst-case.
資料結構實習-二.
演算法 8-1 最大數及最小數找法 8-2 排序 8-3 二元搜尋法.
845: Gas Station Numbers ★★★ 題組: Problem Set Archive with Online Judge 題號: 845: Gas Station Numbers. 解題者:張維珊 解題日期: 2006 年 2 月 題意: 將輸入的數字,經過重新排列組合或旋轉數字,得到比原先的數字大,
第 17 章 樣板 17-1 樣板的基礎 17-1 樣板的基礎 17-2 樣板函數 17-2 樣板函數 17-3 樣板類別 17-3 樣板類別 17-4 非型態參數的樣板類別 17-4 非型態參數的樣板類別 17-5 樣板類別的繼承 17-5 樣板類別的繼承 17-6 特化樣板與靜態成員 17-6 特化樣板與靜態成員.
Chapter 10 m-way 搜尋樹與B-Tree
: Function Overloading ★★★☆☆ 題組: Problem Set Archive with Online Judge 題號: 11032:Function Overloading 解題者:許智祺 解題日期: 2007 年 5 月 8 日 題意:判對輸入之數字是否為.
JAVA 程式設計與資料結構 第十六章 Hash Tables. Introduction Hash Tables 結構為一個 Array ,稱之為 Bucket array 。 如果想要新增一個物件,要根據這個物件的特性 將其加入 Hash Table 內。 Bucket Array 用 A 來代替,其.
Chapter 11 Strings and Vectors. Copyright © 2005 Pearson Addison-Wesley. All rights reserved. Slide 2 Overview An Array Type for Strings (11.1) The Standard.
1 Introduction to Java Programming Lecture 2: Basics of Java Programming Spring 2009.
5 重複迴圈 5.1 增減運算符號 增量運算符號 減量運算符號
第 6 章 迴圈結構 6-1 計數迴圈 6-1 計數迴圈 6-2 條件迴圈 6-2 條件迴圈 6-3 巢狀迴圈 6-3 巢狀迴圈 6-4 While/End While 迴圈 6-4 While/End While 迴圈 6-5 跳出迴圈 6-5 跳出迴圈 6-6 VB.NET 的錯誤處理 6-6 VB.NET.
函式 Function 東海大學物理系‧資訊教育 施奇廷. 函式簡介 當程式越來越大、越複雜時,程式的維護、 除錯會變得更困難,此時必須引入函式來 簡化程式或將程式分段,將程式重複的部 分改寫為函式,將程式「模組化」 這種作法有下列優點:節省程式發展的時 間、邏輯容易瞭解、程式容易除錯、可分 工合作完成程式.
Visual C++重點複習.
資料結構實習-六.
1 Introduction to Java Programming Lecture 2: Basics of Java Programming Spring 2010.
數字系統與資料表示法 教師: 陳炯勳 數系轉換 r進制數字 稱為 base r或 radix r 有r個計數符號,計數順序逢r歸零(進位) A n A n - 1 ‥‥A 2 A 1 A 0 ﹒A -1 A -2 ‥‥A -m 其中A n 及A.
Microsoft Excel.
第8章 字串與陣列 8-1一維陣列的處理 8-2 字串處理 8-3 多維陣列的處理 8-4 動態陣列與參數傳遞 8-5 陣列排序與搜尋.
: Finding Paths in Grid ★★★★☆ 題組: Contest Archive with Online Judge 題號: 11486: Finding Paths in Grid 解題者:李重儀 解題日期: 2008 年 10 月 14 日 題意:給一個 7 個 column.
著作權所有 © 旗標出版股份有限公司 第 14 章 製作信封、標籤. 本章提要 製作單一信封 製作單一郵寄標籤.
幼兒行為觀察與記錄 第八章 事件取樣法.
第 1 章 PC 的基本構造. 本章提要 PC 系統簡介 80x86 系列 CPU 及其暫存器群 記憶體: Memory 80x86 的分節式記憶體管理 80x86 的 I/O 結構 學習組合語言的基本工具.
: How many 0's? ★★★☆☆ 題組: Problem Set Archive with Online Judge 題號: 11038: How many 0’s? 解題者:楊鵬宇 解題日期: 2007 年 5 月 15 日 題意:寫下題目給的 m 與 n(m
McGraw-Hill/Irwin © 2003 The McGraw-Hill Companies, Inc.,All Rights Reserved. 肆 資料分析與表達.
Presentation transcript:

1/46 物件導向的字串處理 內建的完整類別 string 具有豐富的 成員函數,能以物件導向的語法處 理字串,讓程式設計者免除空間安 排及安插結尾符號等瑣碎的工作。 內建的完整類別 string 具有豐富的 成員函數,能以物件導向的語法處 理字串,讓程式設計者免除空間安 排及安插結尾符號等瑣碎的工作。 22

2/46 Chap 22 物件導向的字串處理 22.1 C 風格的字串和物件導向的 string 類別 22.2 String 物件的定義 22.3 字串的更改、清除、剪接與部份複製 22.4 字串之間的比對和比較 22.5 字串物件與 C-style 字串的互換

3/ C 風格的字串和物件導向的 string 類別 C-style string (C 風格的字串 ) 由資料型態為 char 構成的一維陣列,結尾處加上 ‘\0’ 做為 字串的結束符號。 宣告 C 風格字串的三種方式 char s1[20] = "Hello, 您好 !"; // 陣列式的宣告 char* ps2 = "Hello, 您好 !"; // 指標式的宣告 char s3[10] = {'G', 'o', '!', '\0'}; // 列舉陣列元素式的宣告

4/46 使用自動設定字元陣列長度的語法宣 告 C 風格的字串 // 自動設定字元陣列的長度 char s4[] = "Hello, 您好 !"; char s5[] = {'\n', 'G', 'o', '!', '\0'};

5/46 物件導向的 string 類別 在 STL (the Standard Template Library) 中定義。 使用前要在程式開頭處加上 #include 以含入標頭檔 ,完成 string 類別的宣 告。 可以動態地配置記憶空間。 有完整的成員函數,提供了許多方便的運算子。

6/ 定義 String 物件 (1/2) string S1; // 定義一個空的 string 物件 S1 string S2, S3, S4; // 同時定義三個空的 string 物件 string S5("A 是 123"); // S5 的容是 "A 是 123" string S51 = "A 是 123"; // S51 的容是 "A 是 123" string S6(S5) ; // 複製 S5 的內容,另造一個新物件 S6

7/46 string S61 = S5; // 複製 S5 的內容,另造一個新物件 S61 string S7(s); // S4 的內容由 C-style 字串 s 構成

8/46 定義 String 物件 (1/2) string S5("A 是 123"); // S5 的內容是 "A 是 123“ string S8(5, ‘c’); // S8 由 5 個 ‘c’ 字元所構成 string S9(S5, 2); // S9 由 S5[2] 及其後的所有字元 // 構成,亦即 " 是 123"; string S91 (S5, 2, 4); // S91 由 S5[2] 起算,長度為 4 個字元的 // 部份所構成,亦即 " 是 1“ string* pS = new string[2]; // 動態配置了兩個 string 物件, // pS 指向第一個物件的起頭處

9/46 使用下標指定 string 物件的元素 S1[0] 代表 string 物件 S1 的第一個字元。 S1[1] 代表 string 物件 S1 的第二個字元。

10/ 字串的更改、清除、剪接與部份 複製 (1/5) ( 假設 S1 和 S2 為兩個先前已定義過的字串 物件 ) : S1[2]='G'; // 將 S1 的第 3 個字元改成 'G' S1.at(2)=‘G’; // 與 S1[2]=‘G’; 相同 S2.insert(2,S1);// 在 S2[2] 前插入字串 S1

11/46 字串的更改、清除、剪接與部份複製 (2/5) swap(S1,S2); // 將 S1 和 S2 的內容互相交換 S1.swap(S2); // 將 S1 和 S2 的內容互相交換 S1.resize(3); // 只保留 S1[0] 到 S1[2] 共 3 個字元, // 其餘字元全數清除 S1.resize(5,‘A’); // 如果 S1 原來的字串長度大於 5 , // 只保留前 5 個字元,如果原來的字串長度 // 小於 5 ,則不足之處全補上字元 'A'

12/46 字串的更改、清除、剪接與部份複製 (3/5) S2.erase(2); // 清除自 S2[2] 起之後的所有字元 S2.erase(2,3); // 清除從 S2[2] 起共 3 個字元 S2.erase(); // 將 S2 的內容全部清除 S2.erase(2,5); // 將 S2[2] 到 S2[6] 共 5 個字元清除 S2.replace(2,3,S1); // 將 S2[2] 到 S2[4] 共 3 個 // 字元清除並以 S1 取代

13/46 字串的更改、清除、剪接與部份複製 (4/5) S2=S1; // S2 的內容與 S1 相同,但兩者為獨立物件 S2.assign(S1); // 與 S2=S1 相同 S2.assign(S1,2,3); // S2 的內容為 S1[2] 到 S1[4] 共 3 個字元 S2=S1.substr(2); // 將 S1[2] 及其後的所有內容存到 S2 中 S2=S1.substr(2,3); // 將 S1[2] 到 S1[4] 共 3 個字元存到 // S2 中,與 S2.assign(S1,2,3) 相同

14/46 字串的更改、清除、剪接與部份複製 (5/5) S2.append(S1); // 在 S2 之後串接上 S1 S2.append(S1,2,3); // 在 S2 之後串接上 S1[2] 到 S2[4] // 共 3 個字元 S3=S1+S2; // S3 的內容改為由 S1 和 S2 串接而成 S2+=S1; // 在 S2 之後串接上 S1

15/46 使用 begin() 和 end() 兩個指標物件直 接指定 string 物件的起頭和結尾處 // 將 S2[2] 到 S2 倒數第 4 個字元間的內容附加到 S1 之後: S1.append(S2.begin()+2, S2.end()-3); // 將 S2[2] 到 S2 倒數第 4 個字元間的內容清除: S1.erase(S1.begin()+2, S1.end()-3); // 將 S1 的前 3 個字元複製到 S2[2] 至 S2[4] 的位置: S1.copy(S2.begin()+2, 3);

16/46 範例程式 ( 字串物件的操作 ) 檔案 ModifyString.cpp // ModifyString.cpp #include using namespace std; int main() { string S1(" "), S2("abcdefghi"); string S3(" 必需 do it"), S4, S5 (" 長度是 123"); string S6(1,'A'), S7(S3,1,3), S8 (S3, 2, 5); cout << "(1) S3 原來的內容是 : " << endl; cout << " " << S3 << endl; cout << " 執行 string S8 (S3, 2, 5); 後 \n" << " S8 = " << S8 << endl; cout << "(2) S1 原來的內容是 : " << endl; cout << " " << S1 << endl; S1.resize(7); cout << " 執行 S1.resize(7); 後 \n " << " S1 = " << S1 << endl; cout << "(3) S5 原來的內容是 : " << endl; cout << " " << S5 << endl; S5='A';

17/46 cout << " 執行 S5 ='A'; 後 \n " << " S5 = " << S5 << endl; cout << "(4) S1 原來的內容是 :" << endl; cout << " " << S1 << endl; cout << " S3 原來的內容是 :" << endl; cout << " " << S3 << endl; S3.copy(S1.begin()+2,4); cout << " 執行 S3.copy(S1.begin()+2,4) 後." << endl; cout << " S1 的內容是 :" << endl; cout << " " << S1 << endl; cout << " S3 的內容是 :" << endl; cout << " " << S3 << endl; cout << "(5) S1 原來的內容是 :" << endl; cout << " " << S1 << endl; cout << " S3 原來的內容是 :" << endl; cout << " " << S3 << endl;

18/46 S3=S1.substr(2,5); cout << " 執行 S3=S1.substr(2,5); 後." << endl; cout << " S3 的內容是 :" << endl; cout << " " << S3 << endl; cout << "(6) S1 原來的內容是 :" << endl; cout << " " << S1 << endl; S1.erase(1,3); cout << " 執行 S1.erase(1,3); 後." << endl; cout << " S1 的內容是 :" << endl; cout << " " << S1 << endl; cout << "(7) 執行 S4=S1+S3; 後." << endl; S4=S1+S3; cout << " S4 的內容是 :" << endl; cout << " " << S4 << endl; return 0; };

19/46 程式執行結果 (1)S3 原來的內容是 : 必需 do it 執行 stringS8 (S3, 2, 5); 後 S8 = 需 do (2)S1 原來的內容是 : 執行 S1.resize(7); 後 S1 = (3)S5 原來的內容是 : 長度是 123 執行 S5 ='A'; 後 S5 = A

20/46 (4)S1 原來的內容是 : S3 原來的內容是 : 必需 do it 執行 S3.copy(S1.begin()+2,4) 後. S1 的內容是 : 01 必需 6 S3 的內容是 : 必需 do it (5)S1 原來的內容是 : 01 必需 6 S3 原來的內容是 : 必需 do it 執行 S3=S1.substr(2,5); 後. S3 的內容是 : 必需 6

21/46 (6)S1 原來的內容是 : 01 必需 6 執行 S1.erase(1,3); 後. S1 的內容是 : 0 需 6 (7) 執行 S4=S1+S3; 後. S4 的內容是 : 0 需 6 必需 6

22/ 字串之間的比對和比較 (1/2) S1.find(S2); // 在 S1 中尋找 S2 的組成字元所在的位置 S1.find(S2,S3); // 由 S1[3] 開始尋找 // S2 的組成字元所在的位置 S1.find_first_of(S2); // 在 S1 中尋找第一個吻合 // S2 的組成字元所在的位置 S1.find_first_of(S2,3);// 由 S1[3] 開始尋找第一個吻合 // S2 的組成字元所在的位置

23/46 字串之間的比對和比較 (2/2) // 在 S1 中尋找第一個不吻合 S2 的組成字元所在的位置 S1.find_first_not_of(S2); // 在 S1 中尋找最後吻合 S2 的組成字元所在的位置 S1.find_last_of(S2); // 在 S1 中尋找最後不吻合 S2 的組成字元所在的位置 ; S1.find_last_not_of(S2);

24/46 字串內容的檢查 S1.size(); // 檢查 S1 內的字元數目 S1.length(); // 與 S1.size(); 相同 S1.empty(); // 檢查 S1 是否為空字串,輸出為 // true 或 false

25/46 範例程式 檔案 FindSub.cpp 使用 find() 在字串物件 (S1 和 S2) 中尋找吻合另 一個字串物件 (Sub1 和 Sub2) 的位置。 // FindSub.cpp #include using namespace std; int main() { string S1="I do not know it at all."; string S2=" 說真的,我不知道她是否愛我。 "; int Site, Length1, Length2, Count; string Sub1 = "no"; string Sub2 = " 我 "; Length1 = Sub1.size(); Count = 0; Site = 0; cout << " 字串 \"" << Sub1 << "\" 位於字串 \"" << S1 << "\" 的位置在 :" << endl;

26/46 while ((Site = S1.find(Sub1,Site)) !=-1) { cout << Site << " "; Site=Site+Length1; Count++; }; cout << "\n 共有 " << Count << " 個 \"" << Sub1 << "\" 在其中." << endl; Length2 = Sub2.size(); Count = 0; Site = 0; cout << " 中文字 \"" << Sub2 << "\" 位於字串 \"" << S2 << "\" 的位置在 :" << endl; while ((Site = S2.find(Sub2,Site)) !=-1) { cout << Site << " "; Site=Site+Length2; Count++; }; cout << "\n 共有 " << Count << " 個 \"" << Sub2 << "\" 在其中." << endl; return 0; }

27/46 程式執行結果 (1) 字串 “no" 位於字串 "I do not know it at all." 的位置在 : 5 10 共有 2 個 "no" 在其中. (2) 中文字 " 我 " 位於字串 " 說真的,我不知道她是否愛我。 " 的位置在 : 8 24 共有 2 個 " 我 " 在其中

28/46 字串之間的比較 字串由 char 構成,依照 ASSII 碼的編號方式可以比較大小。 字串有兩種比較方式 : (1) 使用重載運算子, (2) 使用成員函數 compare()

29/46 使用重載運算子比較字串 S1 = S2+S3; // 將 S2 和 S3 串接合併,存入 S1 S1 += S2; // S1 的尾端串接了 S2 的內容 cout << S1; // 將 S1 透過資料流輸出 cin >> S2; // 透過資料流將資料輸入 S2 內其中 //cin >> S2; 可以寫成 //getline(cin,S2);

30/46 使用成員函數 Compare() 指令 S1.compare(S2); 的輸出值有 1 、 0 和 -1 三種: 1 如果 S1 > S2 0 如果 S1 = S2 -1 如果 S1 < S2

31/46 範例程式 檔案 StringBubble.cpp 改寫 10.6 節的範例程式 Bubble.cpp ,使用比較大小的 運算子「 > 」將字串依照字典的次序排列。 還運用了 22.3 節介紹的字串成員函數 swap() 代替原來自行定義的樣 版函數 Exchange() 以互相交換字串的內容。

32/46 // StringBubble.cpp #include using namespace std; // --- 定義樣版函數 Bubble() template void Bubble(T * const V, int N ) { for (int i=0; i<N; i++) for (int j=N-1; j>i; j--) if (V[j]<V[j-1]) swap(V[j],V[j-1]); return; }

33/46 // ---- 主程式 int main() { const int Size = 5; int i; string Students[Size]= {"Nancy","Lulu", "Margaret","Stephanie","Monica"}; cout << "\n 執行 Bubble() 之前, Data 的值是 :" << endl; for (i=0; i<Size; i++) cout << "(" << i+1 << ") " << Students[i] << endl; Bubble(Students, Size); cout << "\n 執行 Bubble() 之後, Data 的值是 :" << endl; for (int i=0; i<Size; i++) cout << "(" << i+1 << ") " << Students[i] << endl; return 0; }

34/46 程式執行結果 執行 Bubble() 之前, Data 的值是 : (1) Nancy (2) Lulu (3) Margaret (4) Stephanie (5) Monica 執行 Bubble() 之後, Data 的值是 : (1) Lulu (2) Margaret (3) Monica (4) Nancy (5) Stephanie

35/46 使用 C_str() 成員函數將字串物件轉 換為 C-style 字串 使用資料型態為「 const char * 」的指標 pSc , 以代表 C-style 字串: string S1("FileName"); const char* pSc; pSc = S1.c_str(); 這時 pSc 只是指向原先 S1 物件內字元陣列的指標, 並沒有另外複製產生新的字串。

36/46 c_str() 的轉換結果屬於資料型態 「 const char * 」 S1.c_str() 無法直接由「 char * 」的指標接收: char* pS2; // pS2 為 「 char * 」的指標 pS2 = S1.c_str(); // 錯誤!

37/46 將字串物件的內容複製到字元陣列 char [] string S1("FileName"); char CS[10]; strcpy(CS, S1.c_str());

38/46 使用 strcpy() 將 S1 的內容複製到字元 陣列指標「 char * 」 指標所代表的位置必需有夠的空間: stringS1("FileName"); char* pS = new char[S1.length()+1]; strcpy(pS, S1.c_str());

39/46 使用 data() 成員函數將字串物件轉換 為 C-style 字串 stringS2("abcdefghi"); const char* pSc; pSc = S2.data(); 這個語法並沒有另外複製產生新的字串。

40/46 將 C-style 字串轉換為 string 物件 string S3, S4; char CS2[20] = "Hello! 您好! "; char* pS2 = " 早安! "; S3 = CS2; // 「 = 」在 string 類別中已正確重載過 S4 = pS2; 此時 S3 和 S4 為複製產生的新字串物件。

41/46 範例程式 檔案 CString.cpp // CString.cpp #include using namespace std; // --- 主程式 int main() { string S1(" "), S2("abcdefghi"), S3, S4; // -----(1) cout << S1.c_str() << endl; char CS[10]; char* pS = new char[S1.length()+1]; 示範和驗證字串物件和 C-style string 之間的轉換。

42/46 // -----(2) strcpy(pS, S1.c_str()); cout << pS << endl; // -----(3) strcpy(CS, S1.c_str()); // -----(4) S1.resize(4); cout << pS << endl; const char* pSc; // -----(5) pSc = S1.c_str(); cout << pSc << endl; S1[2]='A'; // -----(6) cout << pSc << endl; // -----(7) pSc = S2.data(); cout << pSc << endl; S2.resize(4);

43/46 // -----(8) cout << pSc << endl; char Cs2[20] = "Hello, 您好! "; char* ps2 = "Good morning, 早安! "; // -----(9) S3 = Cs2; S4 = ps2; cout << S3 << S4 << endl; // -----(10) Cs2[0]='G'; ps2[0]='A'; cout << S3 << S4 << endl; return 0; }

44/46 程式執行結果 (1) S1 原來的內容是 : S1.c_str() 可以直接以 cout 輸出 : (2) pS 是一個由 strcpy(pS, S1.c_str()) 產生的 C-style string: (3) CS 是一個由 strcpy() 複製而來的字串陣列 : (4) S1 在此以 S1.resize(4) 更動. pS 是 ( 沒有改變 ): (5) pSc = S1.c_str(): pSc 是 : 0123

45/46 (6) S1[2] 在此以 S1[2]='A' 更動. pSc 是 : 01A3 (7) S2 原來的內容是 : abcdefghi pSc = S2.data(): pSc 是 : abcdefghi (8) S2 在此以 S2.resize(4) 更動. pSc 是 : abcd (9) 定義 Cs2 和 ps2 經由 S3 = Cs2 後. S3 是 : Hello, 您好! 經由 S4 = ps2 後. S4 是 : Good morning, 早安!

46/46 (10)Cs2[0] 和 ps2[0] 在此更動. Cs2 是 : Gello, 您好! ps2 是 : Aood morning, 早安! S3 是 : Hello, 您好! S4 是 : Good morning, 早安!