代碼邏輯逐行解析
char str[] = "Enter enter the number hello world!";
char ch = 'e';
char *Got_char = str; // 1. 為什麼用指針而非數組名?
int count = 0;
while (Got_char = strchr(Got_char, ch)) { // 2. 這行如何工作?
++Got_char; // 3. 為什麼遞增指針?
++count; // 4. 為什麼遞增計數?
}
核心問題解答
1. 為什麼 char *Got_char = str 而非直接用 str?
str 是數組名,屬於常量指針,不可修改(不能 ++、--、賦值)
Got_char 是指針變量,可修改指向位置,支持遞增操作
- 這是 C 語言「數組名退化為指針但不可修改」的核心特性
2. Got_char = strchr(Got_char, ch) 工作原理
strchr(s, c):從指針 s 指向的字符串中查找字符 c 首次出現位置
- 返回值:找到返回該字符地址(指針),未找到返回
NULL
- 循環條件:賦值表達式的值即為賦值結果,非 NULL 為真,NULL 為假 → 自動終止
3. 為什麼 ++Got_char?
strchr 返回找到字符的地址,若不遞增,下次循環會再次找到同一字符 → 死循環
++Got_char 移動到下一個字符位置,繼續向後查找
4. 為什麼 ++count?
- 每次成功查找(
strchr 非 NULL)表示發現一個目標字符
- 累加統計總出現次數
內存演示圖解
str: E n t e r e n t e r ...
↑ ↑
str Got_char (首次找到 'e' 位置)
++Got_char 後:
E n t e r e n t e r ...
↑
Got_char (指向 'n',下次從這裡找)
完整可運行程序
#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <string.h>
int main(void) {
char str[] = "Enter enter the number hello world!";
char ch = 'e';
char *Got_char = str;
int count = 0;
while ((Got_char = strchr(Got_char, ch)) != NULL) {
++Got_char;
++count;
}
printf("字符串: \"%s\" 中字符 '%c' 出現 %d 次\n", str, ch, count);
return 0;
}
輸出結果
字符串: "Enter enter the number hello world!" 中字符 'e' 出現 4 次
進階:統計所有字符頻率
int freq[256] = {0};
for (char *p = str; *p; p++) {
freq[(unsigned char)*p]++;
}
for (int i = 0; i < 256; i++) {
if (freq[i]) printf("'%c': %d\n", i, freq[i]);
}