使用 string 型態


直接操作字元陣列來進行字串操作是比較低階的行為,就如之前所說的,陣列本身對自己的長度沒有意識,所以無法判斷自己是否為空字串,而陣列也不能直接指定 給另一個陣列,所以您無法直接將字串指定給另一個字串,您也無法對兩個字串直接進行串連的動作,例如:
char str1[] = "text1";
char str2[] = "text2";
str1 = str2; // error
cout << str1 + str2 << endl; // error

C++標準函式庫提供了string類別,您可以使用這個類別來建立實例,並進行各項高階的字串抽象行為,像是字串的指定、串接等,要使用string類 別,您要先含入string表頭檔:
#include <string>

您可以使用三種方式來建立一個string類別的物件(object),例如:
string str1;  // 建立一個string物件,內容為空字串
string str2("caterpillar");  // 以字串常量建立字串
string str3(str2); // 以string實例建立字串

第一個建構字串的方法會建立一個空字串,空字串也是字串,只是長度為0;第二個方法會以字面常量內容來建立string實例;第三個方法會「複製」 str2的內容,並建立一個新的string實例。

您可以使用size()來測試字串長度,使用empty()來測試字串是否為空,使用==來比較兩個字串的字元內容是否相同,例如:

#include <iostream> 
#include <string>
using namespace std;

int main() {
string str1;
string str2("caterpillar");
string str3(str2);

if(str1.empty()) {
cout << "str1 為空字串" << endl;
}

cout << "str1 長度: " << str1.size() << endl;
cout << "str2 長度: " << str2.size() << endl;
cout << "str3 長度: " << str3.size() << endl;

if(str1 == str2) {
cout << "str1 與 str2 內容相同" << endl;
}

if(str3 == str2) {
cout << "str3 與 str2 內容相同" << endl;
}

return 0;
}

執行結果:
str1 為空字串
str1 長度: 0
str2 長度: 11
str3 長度: 11
str3 與 str2 內容相同


您可以將字串指定給另一個字串,例如:
string str1("text1");
string str2("text2");
....
str1 = str2;

這個指定會將str1原本的字串記憶體空間釋放,並重新配置足夠容納str2的記憶體空間,然後將str2的各個字元複製至str1;您也可以將一個C- Style的字串指定給string,例如:
string name("caterpillar");
char str[] = "justin";
name = str;

但是您不能將一個string實例指定給字元陣列,例如:
char str[] = "justin";
string name("caterpillar");
str = name; // error


您也可以直接使用+運算子來串接字串,例如:
str1 = str1 + str2;
str1 = str1 + "\n";

string的實例可以使用下標運算子[ ]指定索引來存取相對應位置的字元,就有如字元陣列的操作一般,例如:

#include <iostream> 
#include <string>
using namespace std;

int main() {
string name("caterpillar");

for(int i = 0; i < name.size(); i++) {
cout << name[i] << endl;
}

return 0;
}

執行結果:
c
a
t
e
r
p
i
l
l
a
r


string類別所生成的物件擁有幾個常用的方法(method),例如:

#include <iostream> 
#include <string>
using namespace std;

int main() {
string str1;
string str2("caterpillar");
string str3(str2);

// assign: 指定字串
str1 = str1.assign(str2, 0, 5);
cout << "str1: " << str1 << endl;
str1 = str1.assign("caterpillar", 5, 6);
cout << "str1: " << str1 << endl;

str1 = "";

// append: 字串串接
str1 = str1.append(str2, 0, 5);
str1 = str1.append(str3, 5, 6);
cout << "str1: " << str1 << endl;

// find: 尋找字串位置
cout << "尋找str1中的第一個pill: "
<< str1.find("pill", 0) << endl;

// insert: 插入字串
cout << "在str1插入字串***: "
<< str1.insert(5, "***") << endl;

cout << "str1長度: " << str1.length() << endl;

return 0;
}

執行結果:
str1: cater
str1: pillar
str1: caterpillar
尋找str1中的第一個pill: 5
在str1插入字串***: cater***pillar
str1長度: 14


以下簡單的說明上面幾個使用到的方法:

方 法 說 明
assign(string, start, num) 從string的第start個字元取出num個字元來指定給另一字串物件。
append(string, start, num) 從string的第start個字元取出num個字元來附加至另一字串物件之後。
find(string, 0) 從引發find的字串物件第0個字元尋找是否有符合string的子字串。
insert(start, string) 將string插入引發insert的字串物件第start個字元之後。
length() 傳回字串的長度。

以上的幾個方法都是重載(Overload)多次的方法,另還有其它的方法,例如compare()等等,更多的參數與方法使用請參考C++相關線上文 件。