代碼對比
原始代碼(%c格式)
char s[] = "ABCD";
char *p;
for (p = s; p < s+4; p++)
printf("%c\n", *p);
輸出結果:
A
B
C
D
修改代碼(%s格式)
char s[] = "ABCD";
char *p;
for (p = s; p < s+4; p++)
printf("%s\n", p);
輸出結果:
ABCD
BCD
CD
D
核心原理解析
| 格式符 | 參數類型 | 行為 | 本例中p的值 |
| %c | char (單字符) | 輸出單個字符 | *p 解引用獲取字符值 |
| %s | char* (字符串指針) | 從指針位置輸出至\0結束 | p 指向當前字符的地址 |
內存佈局演示
數組 s: [A][B][C][D][\0]
地址: 1000 1001 1002 1003 1004
迭代過程:
p=1000: %c→'A' %s→"ABCD"
p=1001: %c→'B' %s→"BCD"
p=1002: %c→'C' %s→"CD"
p=1003: %c→'D' %s→"D"
常見錯誤與避坑
- %s傳入char而非char*:導致訪問非法地址,程序崩潰
- 字符數組未以\0結尾:%s會繼續讀取直到遇到隨機\0,輸出亂碼
- 指針越界:循環條件應為
p < s + strlen(s) 或 p <= s + 3
最佳實踐
- 遍歷字符用
%c + *p
- 打印子串用
%s + p
- 始終確保字符串以\0結尾
- 優先使用
strlen() 計算長度避免魔術數字