Strings — char[] + '\0'

字串

程式語言一 · 導覽投影片

→ / space 前進  回 Esc 總覽 F 全螢幕
導覽:建框架。完整內容在 PDF,可跑範例在 index。

01C 沒有字串型態 · 學習地圖

Python 有 str、Java 有 String,但 C 沒有。C 的字串就是 char 陣列 + 結尾 '\0'。承接 陣列:字串就是 char 陣列。

char[]+'\0'宣告/讀取遍歷/strlen=/== 不行string.h緩衝區溢位ctype 應用

本投影片只建地圖;每站完整程式在 PDF 與 index。

02本質:char[] + '\0'

[0][1][2][3][4][5] 'H''e''l''l''o' '\0' "Hello":5 個字元,佔 6 bytes(含 '\0');函式靠 '\0' 知道結尾

03宣告與讀取

char s[] = "Hello";     // 編譯器算大小=6(含 '\0')
// char s[5] = "Hello"; // 錯!沒位置放 '\0'
scanf("%s", s)
不用 &;讀到空格停;無長度限制會溢位
fgets(s, n, stdin)
讀整行含空格;安全;會含換行 '\n'

04遍歷與手寫 strlen

for (int i = 0; s[i] != '\0'; i++) printf("%c", s[i]);  // 遍歷到 '\0' 停
int len = 0; while (s[len] != '\0') len++;              // strlen 的原理

s[i] != '\0' 是遍歷字串的標準寫法;'\0' 不算進長度。

05不能用 = / ==:要用函式

strcpy(a, "Hello");        // 複製(陣列不能整個 =)
if (strcmp(a, b) == 0) ...  // 比內容(== 比的是位址!)
函式功能
strlen(s)長度(不含 '\0')
strcpy / strcat複製 / 串接(不檢查大小)
strcmp(a,b)比內容:0=相等、<0、>0

06緩衝區溢位(安全)· ctype 應用

緩衝區溢位scanf("%s")strcpy 不檢查大小,輸入過長就寫爆陣列、覆蓋鄰近記憶體(經典攻擊手法)。安全:fgetsscanf("%7s") 限長度。
// ctype.h:toupper/tolower/isalpha…;c-'a' 當索引(承接陣列)
int cnt[26] = {0}; cnt[s[i]-'a']++;           // 字元頻率
s[i] = (s[i] - 'a' + k) % 26 + 'a';           // Caesar 位移

07常見錯誤分類

症狀成因
印出一堆垃圾忘了 '\0'(手動建字串沒補結尾)
放不下 / 寫爆空間不夠("Hello" 要 6);輸入溢位
比較永遠不相等== 比字串(比的是位址)→ 用 strcmp
多了一個換行fgets 把 '\n' 也讀進來了
next

接著動手

PDFindex 跑 遍歷/strlen/大小寫/反轉/回文/Caesar → 本地練習 5 題(開 ASan)→ Quizlet + 測驗卷 ≥ 90%。下一章:指標