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

C 語言 strchr 函數完整指南:字串查找字符的利器

     編輯:C 語言問答

函數原型與標頭檔

#include <string.h>

char *strchr(const char *str, int c);
  • str:要搜尋的目標字串 (以空字元結尾)。
  • c:要查找的字符 (以 int 傳入,內部轉為 unsigned char 比較)。
  • 回傳值:指向字串中第一次出現字符 c 位置的指標;若未找到,回傳 NULL。

核心特性

  1. 查找範圍包含結尾空字元:若搜尋 '\0',會回傳指向字串結尾的指標。
  2. 大小寫敏感:'A' 與 'a' 視為不同字符。
  3. 僅找第一次出現:若需找所有位置,需配合迴圈遞增指標。

基本使用範例

#include <stdio.h>
#include <string.h>

int main() {
    const char *str = "GoldenGlobalView";
    char *ptr;

    // 1. 查找存在的字符 'V'
    ptr = strchr(str, 'V');
    if (ptr != NULL) {
        printf("找到 'V',位置索引: %ld,剩餘字串: %s\n", ptr - str, ptr);
        // 輸出: 位置索引: 13,剩餘字串: View
    } else {
        printf("未找到 'V'\n");
    }

    // 2. 查找不存在的字符 'Z'
    ptr = strchr(str, 'Z');
    if (ptr == NULL) {
        printf("未找到 'Z',ptr 為 NULL\n");
    }

    // 3. 查找結尾空字元
    ptr = strchr(str, '\0');
    printf("字串結尾位置索引: %ld (長度: %zu)\n", ptr - str, strlen(str));

    return 0;
}

進階應用:字串切割與解析

strchr 常用於尋找分隔符 (如 ':', ',', '=') 以切割字串。

// 解析 "key=value" 格式
char data[] = "username=admin";
char *sep = strchr(data, '=');
if (sep) {
    *sep = '\0'; // 將 '=' 替換為字串結尾,分割成兩個字串
    printf("Key: %s\n", data);      // 輸出: username
    printf("Value: %s\n", sep + 1); // 輸出: admin
}

常見錯誤與注意事項

1. 忽略 NULL 檢查

直接解參考回傳指標 printf("%s", strchr(s, 'x')); 若未找到會導致段錯誤。永遠先檢查是否為 NULL。

2. 修改常量字串

若 const char *s = "abc";,不可透過 strchr 回傳的指標修改內容 (如 *ptr = 'X'),會導致未定義行為。需使用字元陣列 char s[] = "abc";。

3. 混淆 strchr 與 strrchr

  • strchr:由左至右找第一次出現。
  • strrchr:由右至左找最後一次出現 (反向搜尋)。

標準庫實現邏輯 (參考)

char *strchr(const char *s, int c) {
    do {
        if (*s == (char)c) return (char *)s;
    } while (*s++); // 檢查完當前字符後移動,包含 '\0' 的檢查
    return NULL;
}

理解此邏輯有助於掌握為何能搜尋 '\0' 以及指標遞增的時機。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved