# 字串 String --- - string型別支援長度可改變的字元陣列 - 提供大量的函式 - 屬於C++ STL容器庫 - 使用string的程式必須先引入函數庫 ```#include <string>``` ## 定義 string 並初始化 ``` cpp= string str1; // str1將會是個空字串 string str2 = "Fudan"; // 把str2初始化為字串字面常數的副本 string str3("Fudan"); // 把str3初始化為字串字面常數的副本 string str4(str3); // 把str4初始化為str3的副本 string str5(5, 'f'); // 把str5初始為5個f cout << str1 << '\n'; // cout << str2 << '\n'; // Fudan cout << str3 << '\n'; // Fudan cout << str4 << '\n'; // Fudan cout << str5 << '\n'; // fffff ``` ---- ## 讀入 string ``` cpp= string str1, str2, str3; cin >> str1; // 把「以空白分隔的或換行」字串讀入str1 getline(cin, str2); // 把一整行字串讀入str2 cin.get(str3); // 打一格字元讀入str3 ``` - 造成getline()返回的那個換行字元會被捨棄,不會儲存在string --- ## 字串陣列 - 因為字串像是陣列一樣存取,所以也可以利用下標取得特定值 ``` cpp= string str = "fudan"; cout << str[0] << '\n'; // 'f' cuot << str[2] << '\n'; // 'd' ``` --- ## string 的函式 str.empty(): 測試字串是否為空 ``` cpp= string str; cout << (str.empty() ? "yes" : "no") << '\n'; // yes ``` str.size(): 傳回字串長度 ``` cpp= string str = "Fudan"; cout << str.size() << '\n'; // 5 ``` str.length(): 傳回字串長度 ``` cpp= string str = "Fudan"; cout << str.length() << '\n'; // 5 ``` str.find("fd"): 傳回字串fd在str的位置 ``` cpp= string str = "i dont like fd fd"; cout << str.find("fd") << '\n'; // 12 cout << str.find("fd", 13) << '\n'; // 15 cout << str.find("Fd") << '\n'; // 18446744073709551615 ``` 這裡因為字串中沒有"Fd",則會輸出string::npos,而npos是指這個容器的最大容量,用來表示不存在的位置,而我用DEVC++傳回來的是18446744073709551615 str.clear(): 清空str ``` cpp= string str = "fudan"; str.clear(); cout << (str.empty() ? "yes" : "no") << '\n'; // yes ``` str1.swap(str2): 把str1與str2交换 ``` cpp string str1 = "f", str2 = "d"; str1.swap(str2); cout << str1 << ' ' << str2 << '\n'; // d f ``` str[n] = toupper(str[n]): 將指定字元轉為大寫字母,若非英文字母則不處理 ``` cpp= string str = "fudan"; str[0] = toupper(str[0]); cout << str << '\n'; // Fudan ``` str[0] = tolower(str[0]): 將指定字元轉為小寫字母,若非英文字母則不處理 ``` cpp= string str = "FUDAN"; str[0] = tolower(str[0]); cout << str << '\n'; // fUDAN ``` --- ## ASCII碼 - 前面提過字串像是陣列一樣存取,而每格都以ASCII碼的格式存取 -- 大寫英文字母A ~ Z (65 ~ 90) -- 小寫英文字母a ~ z (97 ~ 122) -- 數字0 ~ 9 (48 ~ 57) - 因此可以用來 -- 字元轉成整數 -- 整數轉成字元 -- 判斷字元內容是大寫英文字母、小寫英文字母、數字或其他 -- 轉換字元英文大小寫 - 可以結合前面講過的字串陣列 ``` cpp= string str1 = "F", str2 = "FuDan"; int a = 68; cout << (int)str1 << '\n'; // 70 cout << (char)a << '\n'; // D for (int i = 0; i < str2.length(); i++) cout << (int)str2[i] << ' '; // 70 117 68 97 110 ``` --- ## 程式設計題目:統神端火鍋 - 題目敘述: 最近十分流行"統神端火鍋"的影片,有許多釣魚連結都導向這支影片,很多人點進去以後才驚覺受騙了。由於這部影片原長為8秒鐘,許多人怕再次受騙,決定不再點開8秒鐘的影片。被釣魚的人數下降以後,又有新的"統神端火鍋"了,有好多版本、不同的片長,但這些說白了,就只是把原版的影片重複播放罷了。而統神為了不再被觀眾釣魚,決定只要總片長是8秒的倍數的影片,全都Ban掉,請你幫他分辨吧! - 輸入說明: 輸入一數n,代表接下來有n支影片,之後每行輸入$h_1$、$m_1$、$s_1$、$h_2$、$m_2$、$s_2$ ,(*0* $\leq$ $h_1$、$h_2$$\leq$ *23*)、(*0* $\leq$ $m_1$、$m_2$$\leq$ *60*)、(*0* $\leq$ $s_1$、$s_2$$\leq$ *60*),$h_1$、$s_1$、$m_1$分別代表影片開始播放的小時、分鐘、秒數,$h_2$、$s_2$、$m_2$分別代表影片結束播放的小時、分鐘、秒數。 - 輸出說明: 若影片片長為8秒或其倍數,則輸出"阿就說那不是我"(不含引號),若不是,則輸出"只有今天限定,冰冰姐泡湯"(不含引號)。