【C++ 筆記】字串(String) - part 9 === 目錄(Table of Contents): [TOC] --- 很感謝你點進來這篇文章。 你好,我並不是什麼 C++、程式語言的專家,所以本文若有些錯誤麻煩請各位鞭大力一點,我極需各位的指正及指導!!本系列文章的性質主要以詼諧的口吻,一派輕鬆的態度自學程式語言,如果你喜歡,麻煩留言說聲文章讚讚吧! 字串(String) --- 字串是由許多的字元所組成的,但字串實際上它是一個一維陣列,以 null 字元('\0')終止符號為結尾。 如下: ```cpp= char a[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; ``` Hello 共有 5 個字元,但實際上在 C++ 中存在於 6 個字元,因多一個 '\0' 表示字串的結尾。 arraysize 因此要寫 6。 也可以寫成這樣: ```cpp= char a[] = "Hello"; ``` 但實際上我們也不用那麼麻煩,加上 '\0' 上去,C++ 編譯器會在初始化陣列時自動加上去。 以下是一個範例,輸出以上的說明文字: ```cpp= #include <iostream> using namespace std; int main(){ char a[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; char b[] = "Hello"; cout << a << endl; cout << b; return 0; } ``` 輸出結果: ``` Hello Hello ``` 可發現 '\0' 沒有在上面,因為 null 字元或是 '\0' 本身就是一個"空"的字元,表示一個字串的結尾。 ### cstring 函式庫 --- 語法: ```cpp= #include <cstring> ``` | 序號 | 函數 | | -------- | -------- | | 1 | strcpy(s1, s2); -> 複製字串 s2 至 s1 | | 2 | strcat(s1, s2); -> 連接字串 s2 到字串 s1 的結尾,連接字串也可以用 + 號。 | | 3 | strlen(s1); -> 回傳字串 s1 的長度。 | | 4 | strcmp(s1, s2); -> 如果 s1 和 s2 是相同的,則回傳 0;如果 s1 < s2 則回傳值小於 0;如果 s1>s2 則傳回值大於 0。 | | 5 | strchr(s1, ch); -> 回傳一個指標,指向字串 s1 中字元 ch 第一次出現的位置。 | | 6 | strstr(s1, s2); -> 回傳一個指標,指向字串 s1 中字串 s2 第一次出現的位置。 | 細則可參考:https://www.w3schools.com/cpp/cpp_ref_cstring.asp 以下是一範例,可當作練習: ```cpp= #include <iostream> #include <cstring> // C 字串處理函式庫 using namespace std; int main() { char s1[100] = "Hello, "; char s2[] = "World!"; char s3[100]; char ch = 'o'; // 1. strcpy - 複製字串 strcpy(s3, s2); cout << "用 strcpy 將 s2 複製到 s3: " << s3 << endl; // 2. strcat - 字串連接 strcat(s1, s2); cout << "用 strcat 將 s2 連接到 s1: " << s1 << endl; // 3. strlen - 獲取字串長度 cout << "s1 的長度: " << strlen(s1) << endl; // 4. strcmp - 比較字串 int cmpResult = strcmp(s1, s2); if (cmpResult == 0) { cout << "s1 = s2" << endl; } else if (cmpResult < 0) { cout << "s1 < s2" << endl; } else { cout << "s1 > s2" << endl; } // 5. strchr - 查找字元在字串中的位置 char* chPos = strchr(s1, ch); if (chPos) { cout << "字元 '" << ch << "' 第一次出現在 s1 的位置: " << (chPos - s1) << endl; } else { cout << "字元 '" << ch << "' 未在 s1 中找到" << endl; } // 6. strstr - 查找子字串在字串中的位置 char* subStrPos = strstr(s1, s2); if (subStrPos) { cout << "字串 \"" << s2 << "\" 第一次出現在 s1 的位置: " << (subStrPos - s1) << endl; } else { cout << "字串 \"" << s2 << "\" 未在 s1 中找到" << endl; } return 0; } ``` 輸出結果: ``` 用 strcpy 將 s2 複製到 s3: World! 用 strcat 將 s2 連接到 s1: Hello, World! s1 的長度: 13 s1 > s2 字元 'o' 第一次出現在 s1 的位置: 4 字串 "World!" 第一次出現在 s1 的位置: 7 ``` ### string 函式庫 --- 語法: ```cpp= #include <string> ``` string 是一個類別(Class),底部有許多方法(Method)可使用,這要等到學物件導向程式設計(OOP)才會開始接觸之。 可能要到後期才會介紹到此函式庫。 以下是一個範例: ```cpp= #include <iostream> #include <string> using namespace std; int main () { string str1 = "runoob"; string str2 = "google"; string str3; int len ; // 複製 str1 到 str3 str3 = str1; cout << "str3 : " << str3 << endl; // 連接 str1 和 str2 str3 = str1 + str2; cout << "str1 + str2 : " << str3 << endl; // 連接後,str3 的總長度 len = str3.size(); cout << "str3.size() : " << len << endl; return 0; } ``` 輸出結果: ``` str3 : runoob str1 + str2 : runoobgoogle str3.size() : 12 ``` 來源:https://www.runoob.com/cplusplus/cpp-strings.html 總結 --- 本文介紹 C++ 中的字串(String)處理,包括基本概念、C 字串和 C++ 字串的使用。 ### 字串的基本概念 --- 字串是由多個字元組成的一維陣列,並以 null 字元('\0')作為結尾。以下範例中為定義字串: ```cpp= char a[6] = {'H', 'e', 'l', 'l', 'o', '\0'}; char b[] = "Hello"; // 編譯器自動加上 '\0' ``` ### C 標準函式庫 cstring --- 本文列出了幾個常用的 C 字串處理函數: `strcpy(s1, s2)`:複製字串 s2 至 s1。 `strcat(s1, s2)`:將字串 s2 連接到 s1 的結尾。 `strlen(s1)`:返回字串 s1 的長度。 `strcmp(s1, s2)`:比較兩個字串。 `strchr(s1, ch)`:查找字元 ch 在 s1 中第一次出現的位置。 `strstr(s1, s2)`:查找字串 s2 在 s1 中第一次出現的位置。 參考資料 --- [C++ cstring Library Reference (cstring functions)](https://www.w3schools.com/cpp/cpp_ref_cstring.asp) [Strings in C++ - GeeksforGeeks](https://www.geeksforgeeks.org/strings-in-cpp/) [C++ 字符串 | 菜鸟教程](https://www.runoob.com/cplusplus/cpp-strings.html)