Try   HackMD

字串 String


  • string型別支援長度可改變的字元陣列
  • 提供大量的函式
  • 屬於C++ STL容器庫
  • 使用string的程式必須先引入函數庫
    #include <string>

定義 string 並初始化

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

string str1, str2, str3; cin >> str1; // 把「以空白分隔的或換行」字串讀入str1 getline(cin, str2); // 把一整行字串讀入str2 cin.get(str3); // 打一格字元讀入str3
  • 造成getline()返回的那個換行字元會被捨棄,不會儲存在string

字串陣列

  • 因為字串像是陣列一樣存取,所以也可以利用下標取得特定值
string str = "fudan"; cout << str[0] << '\n'; // 'f' cuot << str[2] << '\n'; // 'd'

string 的函式

str.empty(): 測試字串是否為空

string str; cout << (str.empty() ? "yes" : "no") << '\n'; // yes

str.size(): 傳回字串長度

string str = "Fudan"; cout << str.size() << '\n'; // 5

str.length(): 傳回字串長度

string str = "Fudan"; cout << str.length() << '\n'; // 5

str.find("fd"): 傳回字串fd在str的位置

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

string str = "fudan"; str.clear(); cout << (str.empty() ? "yes" : "no") << '\n'; // yes

str1.swap(str2): 把str1與str2交换

string str1 = "f", str2 = "d";
str1.swap(str2);
cout << str1 << ' ' << str2 << '\n'; // d f

str[n] = toupper(str[n]): 將指定字元轉為大寫字母,若非英文字母則不處理

string str = "fudan"; str[0] = toupper(str[0]); cout << str << '\n'; // Fudan

str[0] = tolower(str[0]): 將指定字元轉為小寫字母,若非英文字母則不處理

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)
  • 因此可以用來
    字元轉成整數
    整數轉成字元
    判斷字元內容是大寫英文字母、小寫英文字母、數字或其他
    轉換字元英文大小寫
  • 可以結合前面講過的字串陣列
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支影片,之後每行輸入

    h1
    m1
    s1
    h2
    m2
    s2
    ,(0
    h1
    h2
    23)、(0
    m1
    m2
    60)、(0
    s1
    s2
    60),
    h1
    s1
    m1
    分別代表影片開始播放的小時、分鐘、秒數,
    h2
    s2
    m2
    分別代表影片結束播放的小時、分鐘、秒數。

  • 輸出說明:
    若影片片長為8秒或其倍數,則輸出"阿就說那不是我"(不含引號),若不是,則輸出"只有今天限定,冰冰姐泡湯"(不含引號)。