程式語言一 · 導覽投影片
→ / space 前進 ← 回 Esc 總覽 F 全螢幕Python 有 str、Java 有 String,但 C 沒有。C 的字串就是 char 陣列 + 結尾 '\0'。承接 陣列:字串就是 char 陣列。
本投影片只建地圖;每站完整程式在 PDF 與 index。
char s[] = "Hello"; // 編譯器算大小=6(含 '\0')
// char s[5] = "Hello"; // 錯!沒位置放 '\0'
&;讀到空格停;無長度限制會溢位'\n'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' 不算進長度。
strcpy(a, "Hello"); // 複製(陣列不能整個 =)
if (strcmp(a, b) == 0) ... // 比內容(== 比的是位址!)
| 函式 | 功能 |
|---|---|
strlen(s) | 長度(不含 '\0') |
strcpy / strcat | 複製 / 串接(不檢查大小) |
strcmp(a,b) | 比內容:0=相等、<0、>0 |
scanf("%s")、strcpy 不檢查大小,輸入過長就寫爆陣列、覆蓋鄰近記憶體(經典攻擊手法)。安全:fgets 或 scanf("%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 位移
| 症狀 | 成因 |
|---|---|
| 印出一堆垃圾 | 忘了 '\0'(手動建字串沒補結尾) |
| 放不下 / 寫爆 | 空間不夠("Hello" 要 6);輸入溢位 |
| 比較永遠不相等 | 用 == 比字串(比的是位址)→ 用 strcmp |
| 多了一個換行 | fgets 把 '\n' 也讀進來了 |