#include <string.h> char *strrchr(const char *str, int c);
str 中從**右向左**查找字元 c(轉為 unsigned char)最後一次出現的位置。NULL。c 為 int 但只取低 8 位;尋找 '\0' 合法,會回傳字串結束符位址。| 函式 | 搜尋方向 | 回傳 | 典型用途 |
|---|---|---|---|
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;
}
const),嘗試修改屬未定義行為。strrchr 單位為位元組,非字元。UTF-8 下搜尋非 ASCII 字元會誤判;需用 wcsrchr (wide char) 或 UTF-8 感知函式庫。std::string::rfind + substr:型別安全、編碼感知。filesystem::path:專業路徑操作,跨平台。basename/dirname:但會修改輸入緩衝區,非執行緒安全。strrchr 雖簡單,卻是 C 語言處理路徑、解析協議、文字分割的利器。掌握其語意與邊界條件,能寫出更健壯的底層字串處理程式碼。