字串 String

簡介

  • 在C++中是一個類別 (class)
  • 雖然在 #include<iostream> 時就可以使用大部分的功能,但避免踩雷,使用時建議打上 #include<string>

宣告方式

string str; //這是空字串 string str2 = "tree"; string str3(9, 'A'); //AAAAAAAAA string str4[10]; //由字串組成,長度10的陣列

輸入/輸出方式

string str; cin >> str; //只能輸入沒有空格的字串 getline(cin, str); //可以輸入一整行字串,有空格也行 cout << str; //輸出整個字串 cout << str[0]; //輸出字串第0個字元

常用運算子

+

string str1 = "487", str2 = "63"; cout << str1 + str2; //48763

大小關係符號

string str1 = "487", str2 = "63", str3 = "48763", str4 = "487"; cout << (str1 > str2); //0 cout << (str1 < str3); //1 cout << (str2 >= str3); //1 cout << (str1 == str4); //1 cout << (str3 <= str4); //0

[ ]

string str = "tree"; cout << str[0]; // 't' cout << str[2]; // 'e'

常用函數

length()

string str = "string"; cout << str.length(); //6

應用:

string str = "string"; for (size_t x = 0; x < str.length(); x++) cout << str[x] << ' '; //s t r i n g

find()

string str = "tree"; cout << str.find("t") << ' ' << str.find("e") << ' ' << str.find("p"); //0 2 18446744073709551615

說明:18446744073709551615 = string::npos,判斷時可以用
if (str.find("p") == -1) 即可。

to_string()

int n = 48763; string str; str = to_string(n); cout << str; // "48763"

stoll()

int n; string str = "871"; n = stoll(str); cout << n; //871

append()

string str, str2 = "kirito's ", str3 = "superstar", str4 = "stream"; str.append(str2); // "kirito's " str.append(str3, 5, 4); // "star" str.append(" burst ", 6); // " burst" str.append(" str"); // " str" str.append(1, 'e'); // "e" str.append(str4.begin() + 4, str4.end()); // "am" cout << str; // "kirito's star burst stream"

實用工具:ASCII 碼

簡介

ASCII 碼是一種編碼,可以用數字來表示字元,例如:65 為 'A' 這個字元,97 則是 'a',而 48 代表 '0' 這個字元。總共有 128 個編碼,而在C++中,這 128 個編碼是可以和其代表字元互相轉換的。

範例

int n = 67; string str = "C8763"; cout << char(n) << ' ' << int(str[0]);//C 67

常用 ASCII 碼

  • 48~57 分別為 '0' ~ '9'
  • 65~90 分別為 'A' ~ 'Z'
  • 97~122 分別為 'a' ~ 'z'

應用

在某些需要"分解位數"的題目中,使用 string 存整數搭配 ASCII 碼解題可能比用 int 存整數解題輕鬆。 例:DDJ a175:水仙花數
某些題目會要求把英文字母轉成數字並計算,這時也可以利用 ASCII 碼直接轉換。
例:DDJ a251: 多元選修好難喔


趣味題目:DD的哀傷

tree有個朋友,他的名字叫小DD。

小DD是110學測考爛卻還看Hololive的唯一的人。他身材矮胖,滿臉贅肉,眼袋下時常帶些黑影,一頭亂蓬蓬的油膩的頭髮。穿的雖然是運動服,可是又髒又破,似乎六年沒有補,也沒有洗。他對人說話,總是滿口 "草" (くさ,kusa),叫人半懂不懂的。因為他姓小,別人便從描紅紙上的「誰でも大好き」(Daredemo Daisuki) 這半懂不懂的話裡,替他取下一個綽號,叫作小DD。小DD一進留言區,所有正在看直播的人便都對著他笑,有的留言道:「小DD,你又在晚上熬夜了!」他不回覆,在留言區中留言「Rushia nice body boing boing pettan.」便排出7500新台幣。他們又故意地高聲嚷道:「你一定又花買飯錢斗內了!」小DD睜大眼睛說:「你怎麼這樣憑空汙人清白……」「什麼清白?我前天親眼見你在各個直播出現,投彩虹SC。」小DD便漲紅了臉,額上的青筋無法浮現,因為贅肉實在太多,爭辯道:「雙視角觀看不能算DD……雙視角!……單推 Hololive 的事,能算DD嗎?」接連便是難懂的話,什麼「華鯊公約」,什麼「Ahoy」之類,引得眾人都哄笑起來:留言區內外充滿了快活的空氣。

聽人家背地裡談論,小DD原來也當過單推,但終於沒有堅持,又一直加會員,於是越過越窮,弄到將要討飯了。他加會員的原則是:在有限的零用錢內,加越多越好。現在給你許多 Vtuber 的名字及其入會費,請問你知道他加了哪些 Vtuber會員嗎?

輸入說明:

第一行有一數

M,代表小DD的零用錢有多少。
第二行有一數
N
,代表接下來會有幾位 Vtuber。
接下來
N
行,每行有一字串
S
(不會有空白) 及一數
K
S
代表 Vtuber 的名字,
K
代表其入會費。

輸出說明:

第一行輸出小DD加入了幾位 Vtuber 的會員。
第二行以字典序輸出他加入誰的會員,每個會員名間隔一空白,若有多種可能,請輸出:

  1. 剩下零用錢較多,且
  2. 名字較早被輸入的那組。

若可加入所有人的會員,請在第三行輸出"單推 Hololive 的事,能算DD嗎?"(不含引號)。

範例輸入:

300
5
Lamy 75
Aqua 100
Fubuki 100
Korone 100
Pekora 75

範例輸出:

3
Aqua Lamy Pekora