6.6 字元陣列
陣列的型態不是只有 int——char、long long、bool、double 都能排成一排。其中字元陣列特別重要:它讓我們第一次有能力處理「一整串文字」。
char s[500005]; // 一格 1 位元組,50 萬格才 0.5 MB
第二單元 2.4 學過:一個 char 存一個字元。字元陣列就是把很多字元排成一列——一格住一個字。
¶逐字讀入
cin 讀 char 時一次讀一個非空白字元,會自動跳過空白和換行。所以「長度 n 的字串」可以用迴圈一個字一個字拆進陣列:
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> s[i]; // 整串連在一起的字,也會被一個個拆給你
}
輸出同理:cout << s[i] 印出一個字元。
¶字元的比較
字元可以直接用 ==、!=、<、> 比較(實際比的是字元的編號,2.4 提過)。判斷兩個位置的字是否相同,寫 s[i] != s[j] 就好。
¶範例程式碼
判斷一個字串是不是迴文(正著讀、倒著讀長得一樣):
#include <iostream>
using namespace std;
const int MAX_N = 500005;
char s[MAX_N];
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> s[i];
}
// 開頭數來第 i 格的鏡像,是結尾數來第 i 格:s[n - 1 - i]
for (int i = 0; i < n; i++) {
if (s[i] != s[n - 1 - i]) {
cout << "No\n";
return 0; // 找到一對不同就能直接收工
}
}
cout << "Yes\n";
return 0;
}
執行結果(輸入 4 和 abba):
Yes
這正是站上迴文判斷的解答。也可以改用「左右手指」寫法——讓 l、r 從頭尾往中間夾、逐對比較,兩種寫法都對。
動手試試看:把範例改成「把整個字串倒著印出來」(提示:6.4 的倒序遍歷,從 s[n-1] 印到 s[0])。