首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C語言指針遍歷字符數組:printf格式符差異導致輸出結果完全不同

     編輯:程式設計綜合問答

代碼對比

原始代碼(%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的值
%cchar (單字符)輸出單個字符*p 解引用獲取字符值
%schar* (字符串指針)從指針位置輸出至\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

最佳實踐

  1. 遍歷字符用 %c + *p
  2. 打印子串用 %s + p
  3. 始終確保字符串以\0結尾
  4. 優先使用 strlen() 計算長度避免魔術數字
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved