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

strrchr 函數詳解:從右側查找字元,提取檔名最佳利器

     編輯:關於C語言

函式原型

#include <string.h>
char *strrchr(const char *str, int c);

功能說明

  • 在字串 str 中從**右向左**查找字元 c(轉為 unsigned char)最後一次出現的位置。
  • 找到則回傳該位置的指標(包含該字元及其後續所有字元);找不到回傳 NULL。
  • 注意:c 為 int 但只取低 8 位;尋找 '\0' 合法,會回傳字串結束符位址。

對比:strchr vs strrchr

函式搜尋方向回傳典型用途
strchr左→右(首次出現)指向該字元解析協議欄位、跳過前綴
strrchr右→左(最後出現)指向該字元提取檔名、副檔名、路徑分割

經典範例:從完整路徑取得檔名

const char *GetFileName(const char *filePath) {
    if (!filePath) return NULL;
    // 找最後一個 '/' 或 '\' (跨平台)
    const char *p1 = strrchr(filePath, '/');
    const char *p2 = strrchr(filePath, '\\');
    const char *name = (p1 > p2) ? p1 : p2; // 取較後者
    return name ? name + 1 : filePath;      // 跳過分隔符,無分隔符則回傳原字串
}

// 測試
int main() {
    printf("%s\n", GetFileName("/home/user/docs/report.txt")); // report.txt
    printf("%s\n", GetFileName("C:\\Windows\\System32\\cmd.exe")); // cmd.exe
    printf("%s\n", GetFileName("README.md")); // README.md
    return 0;
}

進階用法:取得副檔名

const char *GetExtension(const char *filePath) {
    const char *dot = strrchr(filePath, '.');
    const char *sep = strrchr(filePath, '/');
    const char *sep2 = strrchr(filePath, '\\');
    if (!dot) return "";
    // 確保 '.' 在最後一個路徑分隔符之後
    if (sep && dot < sep) return "";
    if (sep2 && dot < sep2) return "";
    return dot + 1;
}

常見錯誤與注意事項

  1. 未檢查 NULL 回傳:直接解參考會導致崩潰。務必先判斷。
  2. 修改回傳指標指向的內容:若原字串為常數(字面值或 const),嘗試修改屬未定義行為。
  3. 多位元組字元集(MBCS/UTF-8):strrchr 單位為位元組,非字元。UTF-8 下搜尋非 ASCII 字元會誤判;需用 wcsrchr (wide char) 或 UTF-8 感知函式庫。

標準庫替代方案

  • C++17 std::string::rfind + substr:型別安全、編碼感知。
  • Boost filesystem::path:專業路徑操作,跨平台。
  • POSIX basename/dirname:但會修改輸入緩衝區,非執行緒安全。

strrchr 雖簡單,卻是 C 語言處理路徑、解析協議、文字分割的利器。掌握其語意與邊界條件,能寫出更健壯的底層字串處理程式碼。

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