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

C語言標準庫函數速查手冊:分類匯總與工程實踐指南

     編輯:關於C語言

前言:站在巨人的肩膀上

「工欲善其事,必先利其器。」C 語言標準庫 (libc, 嵌入式常用 uClibc/musl) 是系統編程的基石。熟練掌握常用庫函數,能避免重複造輪子、減少 Bug、提升代碼可移植性。本文按頭文件分類匯總高頻函數,並給出**工程落地建議**。

一、 工程化學習與管理建議

  1. 建立個人速查表:Excel/Notion 記錄 `函數名 | 參數 | 返回值 | 頭文件 | 典型用例 | 易錯點`。
  2. Source Insight / VS Code 代碼片段庫:遇到一個函數,寫一個測試用例,累積成個人代碼庫。**離線環境下的救命稻草**。
  3. 驗證實現差異:不同 libc (glibc, musl, MSVC CRT) 在邊界行為 (如 strncpy 不補 '\0', sprintf 返回值) 可能不同,**關鍵路徑必須實測**。
  4. 權威參考:man 3 <func> (Linux), cppreference.com, 《C標準庫》 (P.J. Plauger), 《UNIX環境高級編程》(APUE) — **職業生涯第一參考書**。

二、 核心庫函數分類速查表

1. <ctype.h> 字符分類與轉換 (參數為 int, 行為受 locale 影響)

函數用途備註
isalpha, isdigit, isalnum判斷字母/數字/字母數字僅對 ASCII 0-127 保證行為一致
islower, isupper判斷大小寫
isspace判斷空白字符 (空格,\t,\n,\v,\f,\r)
tolower, toupper大小寫轉換非字母原樣返回

⚠️ 坑:參數必須是 unsigned char 轉 int 或 EOF,否則負值 (如 char 有符號時) 導致未定義行為。正確用法:isalpha((unsigned char)ch)。

2. <string.h> 字符串與內存操作 (核心高頻)

類別函數關鍵語義 / 易錯點
複製/拼接strcpy, strncpystrncpy **不保證** 以 '\0' 結尾!需手動補。
推薦 strlcpy (BSD) / strcpy_s (C11)
strcat, strncat同樣有緩衝區溢出風險,需計算剩餘空間
memcpy, memmove首選 處理二進制數據/重疊內存。memmove 安全處理重疊
memset按字節填充。**不可用於初始化非 0 的 int/float 數組**
比較/查找strcmp, strncmp返回 <0, 0, >0。strncmp 比較前 n 字符
strchr, strrchr查找字符首次/末次出現位置,返回指針
strstr查找子串 (KMP/BMH 實現),返回指針
長度/轉換strlen不含 '\0'。O(n),循環中勿重複調用

3. <stdio.h> 輸入輸出 (流操作)

  • 格式化:printf/scanf 族。格式化字符串漏洞:printf(user_input) 致命!永遠用 printf("%s", user_input)。
  • 文件操作:fopen/fclose/fread/fwrite/fseek/ftell/fflush。注意 fread 返回「成功讀取項數」而非字節數。
  • 緩衝控制:setvbuf 設置行緩衝/全緩衝/無緩衝。fflush(stdout) 強制刷新 (交互式程序關鍵)。
  • 臨時文件:tmpfile() (自動刪除), tmpnam() (不安全)。

4. <stdlib.h> 通用工具:內存、轉換、隨機、環境

5. <time.h> 時間處理

  • time():秒級時間戳 (time_t)。
  • clock():進程 CPU 時間 (精度 CLOCKS_PER_SEC)。
  • strftime():格式化輸出 (依 locale)。
  • gmtime/localtime (非線程安全) → gmtime_r/localtime_r (POSIX) / gmtime_s/localtime_s (C11)。
  • 高精度:clock_gettime(CLOCK_MONOTONIC, ...) (Linux), QueryPerformanceCounter (Win)。

6. <math.h> 數學函數 (需鏈接 -lm)

  • 分類:三角、雙曲、指數對數、冪、取整、絕對值、分解、誤差函數。
  • 浮點異常:errno (EDOM/ERANGE) + fenv.h (fetestexcept)。
  • 精度陷阱:0.1 + 0.2 != 0.3。比較用 fabs(a-b) < epsilon。

7. <signal.h> <setjmp.h> 信號與非局部跳轉

  • 僅在信號處理函數中調用 **Async-signal-safe** 函數 (如 write, _exit, sigaction)。
  • setjmp/longjmp 跨函數跳轉,**不調用析構函數/清理處理器**,C++ 禁用,C 中慎用。

8. POSIX / 系統級擴展 (Unix/Linux 必備,Windows 部分不同)

  • 文件 I/O:open, read, write, close, lseek, fcntl, ioctl, stat (文件描述符 fd)。
  • 進程控制:fork, exec, wait, exit, kill, getpid。
  • 線程:pthread_create, mutex, cond, rwlock, TLS (需 -lpthread)。
  • 網絡:socket, bind, listen, accept, connect, send, recv, epoll。
  • 內存映射:mmap, munmap (大文件/共享內存/零拷貝神器)。

三、 避坑指南 Top 10

  1. gets() **已從 C11 移除**,永遠用 fgets()。
  2. strncpy 不補 '\0';strncat 需手動計算剩餘長度。
  3. sprintf → snprintf (返回需寫入長度,檢查截斷)。
  4. scanf("%s", buf) 無長度限制 → scanf("%99s", buf) 或 fgets+sscanf。
  5. 內存分配**必檢查 NULL**。
  6. 釋放後**置 NULL**,防雙重釋放/野指針。
  7. 避免 atoi/atof,用 strtol/strtod 進行錯誤處理。
  8. 多線程環境用 _r 後綴 / C11 _s 版本函數。
  9. 浮點數**絕不直接 == 比較**。
  10. 格式化字符串**不接受用戶輸入**。

總結

標準庫是 C 程序員的「兵器譜」。**系統性整理 + 實戰驗證 + 關注實現差異**,才能真正轉化為生產力。建議將本文作為索引,配合 `man page` / `cppreference` 深入鑽研每個高頻函數的契約與邊界。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
領域關鍵函數核心提示
動態內存malloc, calloc, realloc, free, aligned_alloc (C11)calloc 零初始化且檢查溢出。free 後指針置 NULL。檢查返回值!
字符串轉數值strtol, strtod, strtoul 族唯一正規解析方式**,支持錯誤檢查 (endptr)、基數、溢出檢測 (errno=ERANGE)。棄用 atoi/atof
隨機數rand, srand (弱) / random, srandom / getrandom (Linux)加密用途必須用 /dev/urandom 或 BCryptGenRandom (Win)
程序控制exit, _exit, atexit, abort, system_exit 不刷新流/調用 atexit。system 有注入風險
環境變量getenv, setenv, unsetenv, putenv
排序/查找qsort, bsearch泛型接口,需編寫比較函數 int (*cmp)(const void*, const void*)