1. 程式人生 > >C++抽象程式設計——字串(1)——字串運算

C++抽象程式設計——字串(1)——字串運算

如今,我們雖然仍然把電腦稱為計算機,但是如今它處理的文字資訊卻遠遠多於我們的數字運算, 現代計算機處理文字資料的能力直接引領了簡訊,電子郵件,文書處理系統,線上參考庫(如百度百科),以及各種其他有用的應用程式的發展。這部分內容介紹了C++中的<string>庫,這個庫提供了很多方便的處理字串的抽象。有這個庫,你將會更容易編寫有趣的應用程式。 

Using strings as abstract values

從概念上講,字串就是由一串簡單的字元構成,比如“hello, world”就是一個包含12個的字串,10個字母,一個逗號,還有一個空格。在C++當中,string的運算都定義在<string>庫中,在使用的時候你需要匯入這個標頭檔案。我們知道資料型別由兩個屬性定義:域(domain)和操作集(set of operations)。 對於字串,域很容易識別:string的域就是所有字元序列的集合。 更有趣的問題,是確定適當的操作集。 早期版本的C ++遵循較老的C語言,提供很少支援操縱字串。 有的只有低階操作,需要你瞭解
底層。 但是C ++的設計者很快就解決了這個問題,引入一個字串類,使我們能夠在更抽象的層面上操作。

在大多數情況下,你可以字串作為原始資料型別使用。就像int和double一樣。 例如,您可以宣告字串變數a並賦予它一個初始值,就像你對整型變數a一樣。 當宣告一個字串變數時,通常我們用雙引號把它括起來。例如,我們定義一行大寫的英文字母表:

const string ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

這句話定義了一個字串常數ALPHABET,並把26個大寫的字母賦值給它。我們同樣可以用 << 和 >> 運算子對字串進行輸入輸出,就像這樣:
#include <iostream>
#include <string>
using namespace std;
int main() {
string name;
cout << "Enter your name: ";
cin >> name;
cout << "Hello, " << name << "!" << endl;
return 0;
}
執行結果圖如下:

這個程式看起來很完美,但是如果你輸入多個單詞,那麼它執行起來就是完全出乎你的意料,就像這樣:

為什麼就只輸出第一個單詞呢?原因就是 >> 運算子一遇到whitespace character(空白字元),它就會停止讀取了,同樣的情況除了空格還包括tab和行末。反過來,如果你想輸出或者輸入含有空白字元的字串,那麼我們就不能用這個運算子,最簡單的解決方法就是呼叫下面的函式:

getline(prompt);  (在string庫)

下面就通過例子來體驗一下怎麼用這個函式。

#include <iostream>
#include <string>
using namespace std;
int main() {
string name;
cout << "Enter your name: ";
getline(cin,name); /*把輸入的字串儲存在字串變數name中*/ 
cout << "Hello, " << name << "!" << endl;
return 0;
}

執行的結果如下,perfect!


String operations

         當你使用<string>庫來進行操作的時候,你就會發現它並不像你之前所學的基本型別的那樣使用,它的大多數運算都是通過函式呼叫來實現的。比如你假設這個庫裡面出口(export)一個計算字串str長度的函式,你可能就會假想它可能這樣子使用:

                            int nChars =length(str);

但是,這在C++中是不正確的,這個表示式的問題就是string不是一個傳統的資料型別,它是類的一個例子,可能是最簡單的用來描述一組值以及相關聯的操作集合的模板。在面嚮物件語言中,屬於類內的值我們稱為物件(object),一個單獨的類可以有很多的物件,每一個這樣的物件我們稱為類的例項(instant)。而應用於類的例項進行的操作,我們就稱為方法(methods),類似於傳統函式。而傳統的函式我們又稱為自由函式(free funtion),因為它們不屬於任何一個類。

         在面向物件的世界中,物件之間的交流是通過各個物件之間傳送請求跟資訊完成的。這些傳輸的東西,我們稱為資訊(message)。初始化方法的物件我們稱為傳送者(sender),而接收資訊的目標物件,我們稱為接受者(receiver)。在C++中,我們通過下面的語法來發送資訊;

                                               receiver.name(arguments)

所以,上面的語句正確的應該是這樣:
int nChars = str.length();

而在<string>中,絕大多數的操作都是用的接收者語法。下面的表列舉了很常用的一些操作:

如果英文不好,我可以解釋一下下:

第一個字串的拼接,第二個同理,在str後面接上str2,並賦給原來的str。

第三個是比較

第四個就是,返回字串str中位於下標k的元素。但是注意,它不會檢查k是否越界

 接下來就是對字串的操作:


這個也解釋一下:

第一個是計算字串中字元的個數,其實就是返回字串的長度。

第二個就是跟上面的一樣,返回位於下標k的值,唯一跟[ ]不同的就是它會檢查是否越界

第三個為擷取字串。擷取從pos到n之間字串。當n不選時候,預設為末尾。

第四個為對比字串。

第五個為尋找字元,從pos位置開始尋找pattern(樣本),並且返回第一次遇到的pattern下標,其中pattern可以是一個字元也可以為一個字串。

還有一些常用的:


這幾個好理解,

第一個從pos位置開始刪除元素n

第二個是從pos位置開始插入str2

第三個是從pos位置開始,我們用str2的元素代替n元素

剩下的自己看。

下一篇  就舉例子如何使用這些方法。最好自己打一下程式碼