# 字串
# 基礎用法
字串實例可以使用 [] 指定索引來存取相對應位置的字元,就有如字元陣列的操作一般
string str1; // 內容為空字串 | |
string str2 = "sololearn"; // 內容為指定的字串常量 |
可使用 str.length () 或 str.size () 得知字串大小
#include <iostream> | |
using namespace std; | |
int main() | |
{ | |
string s="Hello World"; | |
cout<<s長度為<<s.size()<<endl; | |
for(int i=0;i<s.size();i++) | |
cout<<s[i]; | |
return 0; | |
} | |
輸出-->s長度為11 | |
-->Hello World |
從字串上的數字,僅是字元。若直接進行運算,計算的依據將為 ASCII 碼,結果會錯誤
若需要進行運算,則必須先減去 '0' 才行
# 倍數判斷
倍數判斷是運用字串的最基本運用,從 1 到 13 的判別法是很基本的喔!!
# 1 的倍數
所有的數字 (除了 0) 都是 1 的倍數喔~
# 2 的倍數
個位數字為偶數 (含 0)
#include<bits/stdc++.h> | |
using namespace std; | |
int main(){ | |
string s; | |
while(cin>>s){ | |
int length = s.size(); | |
if((s[length-1]-'0')%2==0) | |
cout<<s<<"是2的倍數\n"; | |
else | |
cout<<s<<"不是2的倍數\n"; | |
} | |
return 0; | |
} |
# 3 的倍數
各個數字和為 3 的倍數
#include<bits/stdc++.h> | |
using namespace std; | |
int main(){ | |
string s; | |
while(cin>>s){ | |
int length = s.size(); | |
int tmp = 0; | |
for(int i = 0;i<length;i++){ | |
tmp += s[i] - '0'; | |
} | |
if(tmp%3==0) | |
cout<<s<<"是3的倍數\n"; | |
else | |
cout<<s<<"不是3的倍數\n"; | |
} | |
return 0; | |
} |
# 4 的倍數
末二位數為 4 的倍數
#include<bits/stdc++.h> | |
using namespace std; | |
int main(){ | |
string s; | |
while(cin>>s){ | |
int length = s.size(); | |
int last_two = (s[length-2]-'0')*10+s[length-1]-'0'; | |
if(last_two%4==0) | |
cout<<s<<"是4的倍數\n"; | |
else | |
cout<<s<<"不是4的倍數\n"; | |
} | |
return 0; | |
} |
# 5 的倍數
個位數字為 0 或 5
#include<bits/stdc++.h> | |
using namespace std; | |
int main(){ | |
string s; | |
while(cin>>s){ | |
int length = s.size(); | |
if(s[length-1]=='0'||s[length-1]=='5') | |
cout<<s<<"是5的倍數\n"; | |
else | |
cout<<s<<"不是5的倍數\n"; | |
} | |
return 0; | |
} |
# 6 的倍數
同時是 2 和 3 的倍數
#include<bits/stdc++.h> | |
using namespace std; | |
int main(){ | |
string s; | |
while(cin>>s){ | |
int length = s.size(); | |
bool is_two = false; | |
if((s[length-1]-'0')%2==0) | |
is_two = true; | |
//------------------------------------ | |
int tmp = 0; | |
for(int i = 0;i<length;i++){ | |
tmp += s[i] - '0'; | |
} | |
bool is_three = false; | |
if(tmp%3==0) | |
is_three = true; | |
//------------------------------------- | |
if(is_two&&is_three) | |
cout<<s<<"是6的倍數\n"; | |
else | |
cout<<s<<"不是6的倍數\n"; | |
} | |
return 0; | |
} |
# 7 的倍數
由個數起每三位數字一節,各奇數節的和與偶數節的和相減,其差是 7 的倍數
#include<bits/stdc++.h> | |
using namespace std; | |
int main(){ | |
string s; | |
while(cin>>s){ | |
int length = s.size(); | |
int tmp_A = 0,tmp_B = 0; | |
for(int i = 0;i<length;i+=6){ | |
int tmp = 0; | |
for(int j = 3;j>0;j--) | |
if(i+j<=length){ | |
tmp = tmp * 10 + s[length-i-j]-'0'; | |
} | |
tmp_A +=tmp; | |
} | |
cout<<tmp_A<<endl; | |
for(int i = 3;i<length;i+=6){ | |
int tmp = 0; | |
for(int j = 3;j>0;j--){ | |
if(i+j<=length){ | |
tmp = tmp * 10 + s[length-i-j]-'0'; | |
} | |
} | |
tmp_B +=tmp; | |
} | |
cout<<tmp_B<<endl; | |
int gap = abs(tmp_A-tmp_B); | |
if(gap%7==0) | |
cout<<s<<"是7的倍數\n"; | |
else | |
cout<<s<<"不是7的倍數\n"; | |
} | |
return 0; | |
} |
# 8 的倍數
末三位數為 8 的倍數
#include<bits/stdc++.h> | |
using namespace std; | |
int main(){ | |
string s; | |
while(cin>>s){ | |
int length = s.size(); | |
int last_three = (s[length-3]-'0')*100+(s[length-2]-'0')*10+s[length-1]-'0'; | |
if(last_three%8==0) | |
cout<<s<<"是8的倍數\n"; | |
else | |
cout<<s<<"不是8的倍數\n"; | |
} | |
return 0; | |
} |
# 9 的倍數
各個數字和為 9 的倍數
#include<bits/stdc++.h> | |
using namespace std; | |
int main(){ | |
string s; | |
while(cin>>s){ | |
int length = s.size(); | |
int tmp = 0; | |
for(int i = 0;i<length;i++){ | |
tmp += s[i] - '0'; | |
} | |
if(tmp%9==0) | |
cout<<s<<"是9的倍數\n"; | |
else | |
cout<<s<<"不是9的倍數\n"; | |
} | |
return 0; | |
} |
# 10 的倍數
個位數字為 0
#include<bits/stdc++.h> | |
using namespace std; | |
int main(){ | |
string s; | |
while(cin>>s){ | |
int length = s.size(); | |
if(s[length-1]=='0') | |
cout<<s<<"是10的倍數\n"; | |
else | |
cout<<s<<"不是10的倍數\n"; | |
} | |
return 0; | |
} |
# 11 的倍數
奇數位數字和與偶數位數字和相差為 11 的倍數。
#include<bits/stdc++.h> | |
using namespace std; | |
int main(){ | |
string s; | |
while(cin>>s){ | |
int length = s.size(); | |
int tmp_A = 0; | |
for(int i = 0;i<length;i+=2){ | |
tmp_A +=s[i]-'0'; | |
} | |
int tmp_B = 0; | |
for(int i = 1;i<length;i+=2){ | |
tmp_B +=s[i]-'0'; | |
} | |
int gap = abs(tmp_A-tmp_B); | |
if(gap%11==0) | |
cout<<s<<"是11的倍數\n"; | |
else | |
cout<<s<<"不是11的倍數\n"; | |
} | |
return 0; | |
} |
另一種寫法:
#include<bits/stdc++.h> | |
using namespace std; | |
int main(){ | |
string s; | |
while(cin>>s){ | |
int length = s.size(); | |
int tmp_A = 0,tmp_B = 0; | |
for(int i = 0;i<length;i++){ | |
if(i%2==0) | |
tmp_A +=s[i]-'0'; | |
else | |
tmp_B +=s[i]-'0'; | |
} | |
int gap = abs(tmp_A-tmp_B); | |
if(gap%11==0) | |
cout<<s<<"是11的倍數\n"; | |
else | |
cout<<s<<"不是11的倍數\n"; | |
} | |
return 0; | |
} |
# 12 的倍數
同時是 3 和 4 的倍數
#include<bits/stdc++.h> | |
using namespace std; | |
int main(){ | |
string s; | |
while(cin>>s){ | |
int length = s.size(); | |
//------------------------------------ | |
int tmp = 0; | |
for(int i = 0;i<length;i++){ | |
tmp += s[i] - '0'; | |
} | |
bool is_three = false; | |
if(tmp%3==0) | |
is_three = true; | |
//------------------------------------- | |
int last_two = (s[length-2]-'0')*10+s[length-1]-'0'; | |
bool is_four = false; | |
if(last_two%4==0) | |
is_four = true; | |
if(is_three&&is_four) | |
cout<<s<<"是12的倍數\n"; | |
else | |
cout<<s<<"不是12的倍數\n"; | |
} | |
return 0; | |
} |
# 13 的倍數
由個數起每三位數字一節,各奇數節的和與偶數節的和相減,其差是 13 的倍數
#include<bits/stdc++.h> | |
using namespace std; | |
int main(){ | |
string s; | |
while(cin>>s){ | |
int length = s.size(); | |
int tmp_A = 0,tmp_B = 0; | |
for(int i = 0;i<length;i+=6){ | |
int tmp = 0; | |
for(int j = 3;j>0;j--){ | |
if(i+j<=length){ | |
tmp = tmp * 10 + s[length-i-j]-'0'; | |
} | |
} | |
tmp_A +=tmp; | |
} | |
cout<<tmp_A<<endl; | |
for(int i = 3;i<length;i+=6){ | |
int tmp = 0; | |
for(int j = 3;j>0;j--){ | |
if(i+j<=length){ | |
tmp = tmp * 10 + s[length-i-j]-'0'; | |
} | |
} | |
tmp_B +=tmp; | |
} | |
cout<<tmp_B<<endl; | |
int gap = abs(tmp_A-tmp_B); | |
if(gap%13==0) | |
cout<<s<<"是13的倍數\n"; | |
else | |
cout<<s<<"不是13的倍數\n"; | |
} | |
return 0; | |
} |
# stringstream
stringstream 是一個 C++ 底下的類別,專門拿來讀取字串並且處理,很多時候拿來做字串的切割,或者是 int 跟 string 類別之間的轉換。
# 基本用法
標頭檔:
此時的 stringstream 就像個橋樑,可以負責當中間轉換的部分。
stringstream 提供了 >> 與 << 運算子來讀取或寫入:
_ >> 代表寫入 stringstream 中,<< 代表從 stringstream 拿出
# int 轉成 string
#include <sstream> | |
using namespace std; | |
int main() | |
{ | |
stringstream s1; | |
int number =1234; | |
string output;// 要把 number 轉成字串型態的容器 | |
cout<<"number="<<number<<endl;// 顯示 number=1234; | |
s1<<number; // 將以 int 宣告的 number 放入我們的 stringstream 中 | |
s1>>output; | |
cout<<"output="<<output<<endl;// 顯示 output=1234; | |
} |
值得注意的是我們兩行顯示都是 1234 但是他的資料型態卻已經不一樣了,第一個是 int 的型態,第二行則是 string 的型態。
# string 轉成 int
#include <sstream> | |
using namespace std; | |
int main() | |
{ | |
stringstream string_to_int; | |
string s1="12345"; | |
int n1; | |
string_to_int<<s1; | |
// 也可以使用 string_to_int.str (s1); | |
// 或者 s1=string_to_int.str (); | |
string_to_int>>n1; | |
cout<<"s1="<<s1<<endl;//s1=12345 | |
cout<<"n1="<<n1<<endl;//n1=12345 | |
} |
# 分割字串
#include <sstream> | |
#include <iostream> | |
using namespace std; | |
int main() | |
{ | |
stringstream s1; | |
int i1;// 用來存放 string 轉成 int 的資料 | |
string line;// 讀入每行的資料 | |
getline(cin,line);// 讀入整行的資料 | |
int sum=0;// 計算總和 | |
s1.clear();// 清除緩存 | |
s1<<line; // 也可以使用 s1.str (line); | |
// 還可以寫成 line=s1.str (); | |
while(s1>>i1) | |
sum+=i1;// 把每個轉換成 int 的數字都丟入 sum 累加 | |
cout<<sum<<endl; | |
return 0; | |
} |