8.7 C 字串的讀入、輸出與初始化
¶用 cin >> s 一口氣讀一個字串
有了 C 字串,讀入不用再逐字拆——宣告字元陣列,直接 cin >>:
char s[105];
cin >> s; // 讀入一個「單詞」,自動在結尾補 '\0'
cout << s << '\n'; // 整串印出
cin >> s 的規則:先跳過空白換行,然後一路讀到下一個空白或換行前停下——讀的是一個「單詞」。輸入 abc def 只會讀到 "abc","def" 留給下一次讀取。讀完,電腦自動幫你在結尾補 '\0'。
搭配 4.8 的 EOF 模式,可以把文章裡的單詞一行一行印出:
¶範例程式碼
#include <iostream>
using namespace std;
const int MAX_LEN = 1005; // 比預期的最長單詞多開一點,'\0' 也要住
char s[MAX_LEN];
int main() {
while (cin >> s) { // 一次讀一個單詞,EOF 時結束
cout << s << '\n';
}
return 0;
}
執行結果(輸入 I love AACPSCHOOL 加上換行與 forever):
I
love
AACPSCHOOL
forever
¶宣告時初始化
字元陣列的初始化除了 6.5 那套大括號寫法,多了一個字串專屬的便利寫法——直接用雙引號:
char s[105] = "abc"; // 前 3 格 a b c,「其餘所有格子」都補 '\0'
char t[] = "abc"; // 省略大小:編譯器自動算成 4(含 '\0'!不是 3)
第二種寫法印證了 8.6 的知識:"abc" 佔 4 格。另外,6.5 的規則在這裡也適用——有寫初始化時,沒給到的格子自動補零,而「編號 0 的字元」正是 '\0',所以第一種寫法整個陣列尾端都是乾淨的結尾記號。
動手試試看:寫一支程式,用 cin >> s 讀入一個單詞,把它倒著印出來。長度沒人告訴你——自己從 s[0] 開始往後走,撞到 '\0' 就知道字串有多長(上冊 6.4 的遍歷+本節的結尾記號知識就夠了)。寫完想想:上冊 6.6 的迴文判斷當時要先讀長度 n,現在的你還需要它嗎?