有很多工程師喜歡自己封裝一些標準庫已有的函式,其實自己封裝的函式,並不一定比標準庫好,有時候反而程式碼更冗餘,且有bug。下面就來分享一下C語言常見的一些標準庫。
標準標頭檔案包括:
<asset.h> <ctype.h> <errno.h> <float.h><limits.h> <locale.h> <math.h> <setjmp.h><signal.h> <stdarg.h> <stddef.h> <stdlib.h><stdio.h> <string.h> <time.h>
一、標準定義(<stddef.h>)
檔案<stddef.h>裡包含了標準庫的一些常用定義,無論我們包含哪個標準標頭檔案,<stddef.h>都會被自動包含進來。
這個檔案裡定義:
型別size_t(sizeof運算子的結果型別,是某個無符號整型);
型別ptrdiff_t(兩個指標相減運算的結果型別,是某個有符號整型);
型別wchar_t(寬字元型別,是一個整型,其中足以存放本系統所支援的所有本地環境中的字符集的所有編碼值。這裡還保證空字元的編碼值為0);
符號常量NULL(空指標值);
宏offsetot (這是一個帶引數的宏,第一個引數應是一個結構型別,第二個引數應是結構成員名。
offsetot(s,m)
求出成員m在結構型別t的變數裡的偏移量)。
注:其中有些定義也出現在其他標頭檔案裡(如NULL)。
二、錯誤資訊(<errno.h>)
<errno.h>定義了一個int型別的表示式errno,可以看作一個變數,其初始值為0,一些標準庫函式執行中出錯時將它設為非0值,但任何標準庫函式都設定它為0。
<errno.h>裡還定義了兩個宏EDOM和ERANGE,都是非0的整數值。數學函式執行中遇到引數錯誤,就會將errno置為EDOM,如出現值域錯誤就會將errno置為ERANGE。
三、輸入輸出函式(<stdio.h>)
檔案開啟和關閉:
FILE *fopen(const char *filename, const char *mode);
int fclose(FILE * stream);
字元輸入輸出:
int fgetc(FILE *fp);
int fputc(int c, FILE *fp);
getc和putc與這兩個函式類似,但透過宏定義實現。通常有下面定義:
#define getchar() getc(stdin)
#define putchar(c) putc(c, stdout)
int ungetc(int c, FILE* stream); //把字元 c 退回流 stream
格式化輸入輸出:
int scanf(const char *format, ...);
int printf(const char *format, ...);
int fscanf(FILE *stream, const char *format, ...);
int fprintf(FILE *stream, const char *format, ...);
int sscanf(char *s, const char *format, ...);
int sprintf(char *s, const char *format, ...);
行式輸入輸出:
char *fgets(char *buffer, int n, FILE *stream);
int fputs(const char *buffer, FILE *stream);
char *gets(char *s);
int puts(const char *s);
直接輸入輸出:
size_t fread(void *pointer, size_t size, size_t num, FILE *stream);
size_t fwrite(const void *pointer, size_t size, size_t num, FILE *stream);
四、數學函式(<math.h>)
1. 三角函式:
2. 指數與對數函式:
3. 其他函式:
注:所有上面未給出型別特徵的函式都取一個引數,其引數與返回值都是double型別。
下面函式返回雙精度值(包括函式ceil和floor)。在下表裡,除其中有特別說明的引數之外,所有函式的其他引數都是double型別。
五、字元處理函式(<ctype.h>)v
注:條件成立時這些函式返回非0值。最後兩個轉換函式對於非字母引數返回原字元。
六、字串函式(<string.h>)
1. 字串函式
所有字串函式列在下表裡,函式描述採用如下約定:s、t表示 (char *)型別的引數,cs、ct表示(const char*)型別的引數(它們都應表示字串)。n表示size_t型別的引數(size_t是一個無符號的整數型別),c是整型引數(在函數里轉換到char):
2. 儲存區操作
<string.h>還有一組字元陣列操作函式(儲存區操作函式),名字都以mem開頭,以某種高效方式實現。在下面原型中,引數s和t的型別是(void *),cs和ct的型別是(const void *),n的型別是size_t,c的型別是int(轉換為unsigned char)。
七、功能函式(<stdlib.h>)
1. 隨機數函式:
2. 動態儲存分配函式:
3. 幾個整數函式
幾個簡單的整數函式見下表,div_t和ldiv_t是兩個預定義結構型別,用於存放整除時得到的商和餘數。div_t型別的成分是int型別的quot和rem,ldiv_t型別的成分是long型別的quot和rem。
4.數值轉換
5.執行控制
1)非正常終止函式abort。
原型是:
void abort(void);
2)正常終止函式exit。
原型是:
void exit(int status);
導致程式按正常方式立即終止。status作為送給執行環境的出口值,0表示成功結束,兩個可用的常數為EXIT_SUCCESS,EXIT_FAILURE。
3)正常終止註冊函式atexit。
原型是:
int atexit(void (*fcn)(void))
可用本函式把一些函式註冊為結束動作。被註冊函式應當是無參無返回值的函式。註冊正常完成時atexit返回值0,否則返回非零值。
6. 與執行環境互動
1)向執行環境傳送命令的函式system。
原型是:
int system(const char *s);
把串s傳遞給程式的執行環境要求作為系統命令執行。如以NULL為引數呼叫,函式返回非0表示環境裡有命令直譯器。如果s不是NULL,返回值由實現確定。
2)訪問執行環境的函式getenv。
原型是:
char *getenv(const char *s);
從執行環境中取回與字串s相關聯的環境串。如果找不到就返回NULL。本函式的具體結果由實現確定。在許多執行環境裡,可以用這個函式去檢視“環境變數”的值。
7. 常用函式bsearch和qsort
1)二分法查詢函式bsearch:
void *bsearch(const void *key, const void *base, size_t n, size_t size, int (*cmp)(const void *keyval, const void *datum));
函式指標引數cmp的實參應是一個與字串比較函式strcmp類似的函式,確定排序的順序,當第一個引數keyval比第二個引數datum大、相等或小時分別返回正、零或負值。
2)快速排序函式qsort:
qsort對於比較函式cmp的要求與bsearch一樣。設有陣列base[0],...,base[n-1],元素大小為size。用qsort可以把這個陣列的元素按cmp確定的上升順序重新排列。
void qsort(void *base, size_t n, size_t size, int (*cmp)(const void *, const void *));