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

C 語言 strchr 函數統計字符出現次數:指針遍歷與計數邏輯深度解析

     編輯:程式設計綜合問答

代碼邏輯逐行解析

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]);
}
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved