歡迎加入我的 Discord 群組與我討論程式相關的問題!

字元

C / C++ 中的字元可以用來儲存你的鍵盤上面的符號,包括數字,英文字母,星號等。
而字元的儲存方式則是利用 ASCII Code 的編碼。
字元主要分成兩種: 可顯示和不可顯示。

  • 不可顯示 (控制字元)
    • ASCII 編碼 0 – 31 和 127 是控制字元 (例如之前提到的 ‘\n’ 換行就是一種控制字元)
    • 控制字元會執行一些特定的功能,而不是輸出出來,例如換行
    • 控制字元前面會有反斜線( \ ) ,反斜線則是跳脫字元
      • 跳脫字元可以讓字元脫離原本的字
      • 這樣講有點複雜,再回去原本 ‘\n’ 的例子,原本的 ‘n’ 會輸出一個字元 ‘n’,但是 ‘\n’ 卻會讓他變成換行
      • 常用的跳脫字元有:
        • ‘\n’ 換行 (enter)
        • ‘\t’ 定位 (tab)
        • \\ 輸出反斜線
        • \” 輸出雙引號
        • \’ 輸出單引號
  • 可顯示字元
    • 剩下的 32 – 126 則是可以顯示的字元
    • 這些字元就是可以輸出的,例如: ‘A’, ‘a’, ‘@’

語法

char c;
cin >> c;
c = 'a'; // 字元要用 '' 包住
c = '\0' // 控制字元

應用

Casting (資料型態轉換):
在變數的前面加上 (要的資料型別) 就可以把變數強制改成你想要的型態。

char c = '3';
cout << (int)c << '\n'; // char to int

int x = 40;
cout << (char)x << '\n'; // int to char

注意! 上面把字元換成整數並不能直接輸出 3 這個數字,程式是會把 ‘3’ 這個字元的 ASCII 編號輸出!
反之,下面的 (char)x 也不會把40變成一個字元直接輸出,而是會輸出 ASCII 編號 40 的字元,也就是 (
字元的編碼都按照上面的 ASCII Table

另外,根據 ASCII 編碼可以注意到,數字 ‘0’ 雖然不是從編號 0 開始,但是 ‘0’ – ‘9’ 都是連續的!
因此,我們可以用這個連續的編碼判斷一個字元是不是一個數字。
而如果想要得到那個數字的整數型態的話,將他的編碼減掉’0’就是他的數字。

char c;
cin >> c;
if('0' <= c && c <= '9')  //判斷 ASCII 編碼是不是在數字的範圍裡
    cout << "是數字" << '\n';
else 
    cout << "不是數字" << '\n';

if('0' <= c && c <= '9')
    int value = c - '0';

英文字母也有類似的規律!只是要注意大寫字母的編碼比較小,而且大小寫中間有一些不是字母的符號。

char c;
cin >> c;
if('a' <= c && c <= 'z') 
    cout << "小寫字母" << '\n';
else if('A' <= c && c <= 'Z') 
    cout << "大寫字母" << '\n';
else 
    cout << "不是英文字母" << '\n';

我們也可以透過編碼將小寫字母都改成大寫,或是反過來

char c;
cin >> c;
if('a' <= c && c <= 'z'){
    c -= 32;
    cout << "大寫的 " << c << '\n';
}

字串

學完字串的你有沒有發現,一個字元都只能放一個符號而已呢?
所謂字串就是把很多個字元串再一起! 這邊主要介紹 C++ 的 std::string

語法

C++ std::string 常用的語法有:

  • string.size() / string.length() 取得字串的長度
  • string.substr(開頭, 長度) 取得字串的其中一段子字串
  • 注意string的index跟陣列一樣,是從 0 開始!
  • 輸入輸出的細節可以參考之前的教學
  • 字串是用雙引號 (“) 包住的
string s = "253";
string b;
cin >> b; // 輸入字串,要注意,字串只會讀到空格就會結束,如果要讀一整行包含空格的話要用 getline() 
cout << s.size() << '\n'; // 輸出 3
cout << s.substr(0, 2) << '\n'; // 輸出 "25"

在字串中,我們也可以用之前學到的運算子,只是在字串時他們的行為會有點不一樣。

  • + : 字串中的加號是 concatenate 的意思 (把東西接在後面)
    • 例如: “a” + “b” = “ab”
  • == 可以判斷兩個字串是不是一模一樣
  • > (大於) 和 < (小於) 則是利用他們的字典序判斷,判斷的時間需要花到字串的長度 !
string s1 = "Hi" 
string s2 = "How are you?";
cout << s1 + " " + s2 << '\n'; // Hi How are you?

string s = ""
s += "5"; // s 變成 "2535"
s = " " + s; // s 變成 " 2535"

接下來我們看一個字串的應用題吧!Zerojudge 的 a022. 迴文

這題我們需要輸入一個字串,並且判斷他是不是迴文。而所謂迴文就是正著讀跟反著讀是一模一樣的,像是 ABBA 就是一個迴文,ABC 就不是
這題我們先把字串輸入進來,可以用一個很好用的 function 叫做 reverse()。這個 function 可以幫你把一個字串或是陣列,vector 翻轉。那翻轉過後我們就可以直接比對翻轉前跟翻轉後是不是一樣就可以了 !

#include <bits/stdc++.h>
using namespace std;
int main(){
    string s;
    cin >> s;
    string t = s; // 開一個額外的字串紀錄翻轉前
    reverse(s.begin(), s.end()); // 將原本的字串翻轉
    if(s == t) cout << "yes\n";
    else cout << "no\n";
}

Blog at WordPress.com.