C 語言字串基礎操作全攻略:初始化、長度計算、指標與陣列存取差異
1. 字串初始化三種方式
// 1. 指定大小,列舉字元 (隱含補 \0)
char s1[10] = {'a','b','c'}; // 其餘為 0
// 2. 字串字面值初始化 (自動加 \0、自動計算長度)
char s2[] = "abcdefg"; // 長度 8 (含 \0)
// 3. 指標指向字串常數 (唯讀區,不可修改)
const char *s3 = "hello"; // 或 char *s3 = "hello"; (C 標準建議 const)
2. strlen vs sizeof
char buf[100] = "abc";
strlen(buf) == 3; // 字串長度 (不含 \0)
sizeof(buf) == 100; // 陣列總位元組數
sizeof("abc") == 4; // 字串常數大小 (含 \0)
3. 陣列下標 vs 指標算術
char s[] = "abcdefg";
for (int i=0; i<strlen(s); ++i) printf("%c ", s[i]); // 陣列下標
for (char *p=s; *p; ++p) printf("%c ", *p); // 指標走訪
for (int i=0; i<strlen(s); ++i) printf("%c ", *(s+i)); // 指標算術等價
// s[i] 編譯器轉為 *(s+i)
4. 常見誤區
char *p = "abc"; p[0] = 'x'; → 未定義行為 (修改唯讀記憶體)。
char s[] = "abc"; s = "def"; → 編譯錯誤 (陣列名不可修改)。
char *p = malloc(10); strcpy(p, "abc"); free(p); → 正確動態分配模式。
5. 記憶體區域