前言
C語言標準庫提供了豐富的函數,涵蓋輸入輸出、字串處理、記憶體管理、數學運算、檔案操作、時間日期、進程控制等核心功能。本文系統整理了常用庫函數的原型、功能、參數、返回值及頭檔案,作為開發者的快速查閱手冊。
檔案與目錄操作函數
底層檔案操作(Unix/Linux風格)
| 函數 | 功能 | 關鍵參數 | 返回值 | 頭檔案 |
open() | 開啟檔案 | 路徑、存取模式(O_RDONLY/O_WRONLY/O_RDWR等)、權限 | 檔案描述符/ -1 | fcntl.h, io.h |
close() | 關閉檔案 | 檔案描述符 | 0/ -1 | io.h |
read() | 讀取檔案 | 描述符、緩衝區、位元組數 | 實際讀取位元組數/ -1 | io.h |
write() | 寫入檔案 | 描述符、緩衝區、位元組數 | 實際寫入位元組數/ -1 | io.h |
lseek() | 移動檔案指標 | 描述符、偏移量、起始點(SEEK_SET/SEEK_CUR/SEEK_END) | 新位置偏移量/ -1L | io.h |
標準I/O流操作(ANSI C標準)
| 函數 | 功能 | 關鍵參數 | 返回值 | 頭檔案 |
fopen() | 開啟流 | 檔名、模式("r"/"w"/"a"/"rb"/"wb"等) | FILE* / NULL | stdio.h |
fclose() | 關閉流 | FILE* | 0 / EOF | stdio.h |
fread() | 讀取資料塊 | 緩衝區、元素大小、元素個數、流 | 實際讀取元素數 | stdio.h |
fwrite() | 寫入資料塊 | 緩衝區、元素大小、元素個數、流 | 實際寫入元素數 | stdio.h |
fseek() | 移動流位置 | 流、偏移量、起始點 | 0 / 非0 | stdio.h |
fprintf() | 格式化輸出到流 | 流、格式字串、參數列表 | 輸出位元組數 / EOF | stdio.h |
fscanf() | 格式化輸入自流 | 流、格式字串、位址列表 | 成功轉換項目數 / EOF | stdio.h |
fgets() | 讀取一行字串 | 緩衝區、最大字元數、流 | 字串指標 / NULL | stdio.h |
feof() | 檢查檔案結束 | FILE* | 非0(結束) / 0 | stdio.h |
目錄操作
mkdir()/rmdir():建立/刪除目錄
chdir():改變當前目錄
getcwd():取得當前工作目錄完整路徑
findfirst()/findnext():檔案搜尋(配合ffblk結構)
記憶體管理函數
| 函數 | 功能 | 關鍵特性 | 頭檔案 |
malloc() | 分配記憶體 | 不初始化,返回void* | stdlib.h, alloc.h |
calloc() | 分配並歸零 | 元素個數×大小,自動清零 | stdlib.h, calloc.h |
realloc() | 調整記憶體大小 | 保留原資料,可能移動位址 | stdlib.h |
free() | 釋放記憶體 | 必須是malloc/calloc/realloc返回的指標 | stdlib.h, alloc.h |
farcalloc()/farmalloc() | 遠堆疊分配(16位系統) | 支援>64KB塊,需遠指標 | alloc.h |
字串與字元處理
| 函數 | 功能 | 備註 |
strcpy()/strncpy() | 字串複製 | 後者限制長度,較安全 |
strcat()/strncat() | 字串連接 | 注意緩衝區溢出風險 |
strcmp()/strncmp() | 字串比較 | 返回<0, =0, >0 |
strlen() | 字串長度 | 不含結束符\0 |
strtok() | 字串分割 | 修改原字串,非執行緒安全 |
sprintf()/sscanf() | 格式化字串輸出/輸入 | 類似printf/scanf但針對字串 |
atoi()/atol()/atof() | 字串轉整數/長整數/浮點數 | 錯誤返回0,無法區分"0"與錯誤 |
itoa()/ltoa()/gcvt() | 數值轉字串 | itoa/ltoa支援指定基數(2-36) |
主控台與鍵盤輸入輸出
| 函數 | 功能 | 回顯 | 頭檔案 |
getchar() | 從stdin讀字元 | 有回顯,需Enter | stdio.h |
getch() | 無回顯讀字元 | 無回顯,立即返回 | conio.h |
getche() | 有回顯讀字元 | 有回顯,立即返回 | conio.h |
kbhit() | 檢查鍵盤輸入 | 非阻塞,有按鍵返回非0 | conio.h |
putchar() | 輸出字元到stdout | 宏實現 | stdio.h |
putch() | 直接輸出字元到主控台 | conio.h |
cgets() | 讀取字串到緩衝區 | str[0]=最大長度, str[1]=實際長度, str[2]起存內容 | conio.h |
數學運算函數(math.h)
- 三角函數:
sin(), cos(), tan()
- 對數指數:
log(), log10(), exp(), pow(), sqrt()
- 取整函數:
ceil()(向上), floor()(向下)
- 絕對值:
abs()(int), labs()(long), fabs()(double)
時間日期函數(time.h)
time():取得當前時間(秒數,自1970-01-01)
clock():程序運行CPU時間
gettimeofday():微秒精度時間(Unix/Linux)
ctime(), asctime(), strftime():時間格式化
- DOS環境專用:
getdate(), gettime(), setdate(), settime()
進程控制與執行
| 函數族 | 功能 | 關鍵差異 |
exec*() | 載入並執行新程式 | l=參數列表, v=參數陣列, p=搜尋PATH, e=傳遞環境變數 |
spawn*() | 建立子進程執行 | 父進程繼續運行,DOS/Windows專用 |
system() | 執行Shell命令 | 透過命令解釋器執行 |
exit()/_exit() | 終止進程 | 前者執行清理,後者直接退出 |
atexit() | 註冊退出處理函數 | 可註冊多個,反序執行 |
中斷與硬體存取(DOS/嵌入式專用)
int86()/int86x():執行8086軟中斷(通用/帶段暫存器)
intr():執行中斷(使用REGPACK結構)
geninterrupt():產生軟中斷(需先設定偽變數)
inport()/inportb():從I/O埠讀取字/位元組
outport()/outportb():向I/O埠寫入字/位元組
peek()/peekb():讀取記憶體字/位元組
poke()/pokeb():寫入記憶體字/位元組
getvect()/setvect():讀取/設定中斷向量
enable()/disable():開啟/關閉中斷(巨集)
圖形介面函數(graphics.h - BGI庫)
- 初始化:
initgraph(), detectgraph(), closegraph(), restorecrtmode()
- 繪圖:
line(), rectangle(), circle(), putpixel(), putimage()
- 屬性:
setcolor(), setlinestyle(), setfillstyle(), settextstyle()
- 文字:
outtext(), outtextxy(), textwidth(), textheight()
- 視口:
setviewport(), clearviewport()
- 雙緩衝動畫:
setactivepage(), setvisualpage()
其他實用函數
- 位元操作:
_rotl(), _rotr(), _lrotl(), _lrotr()(循環移位)
- 環境變數:
getenv(), putenv()
- 路徑處理:
fnmerge(), fnsplit(), searchpath()
- 錯誤處理:
perror(), strerror(), errno全域變數
- 斷言:
assert()(debug版生效)
- 訊號處理:
signal(), raise()
- 可變參數:
va_start(), va_arg(), va_end()(stdarg.h)
使用建議與最佳實踐
- 優先使用ANSI標準函數(stdio.h, stdlib.h, string.h等),提高程式碼可移植性。
- 檔案操作檢查返回值,特別是fopen, malloc, realloc等可能失敗的函數。
- 避免使用gets()、strcpy()、sprintf()等不安全函數,改用fgets(), strncpy(), snprintf()。
- 注意平台差異:conio.h, dos.h, graphics.h等為Borland/Turbo C擴展,非標準C。
- 記憶體管理配對:每個malloc/calloc必須對應free,避免洩漏。
- 善用man page或MSDN查閱詳細規格,本文僅供快速參考。