發新話題

C++ Gossip 進階型態 - 《字串》使用 string 型態

C++ Gossip 進階型態 - 《字串》使用 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 << 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++相關線上文件。

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。