有很多工程師喜歡自己封裝一些標準庫已有的函數(shù),其實自己封裝的函數(shù),并不一定比標準庫好,有時候反而代碼更冗余,且有bug。下面就來分享一下C語言常見的一些標準庫。
標準頭文件包括:
一、標準定義(
文件
這個文件里定義:
類型size_t(sizeof運算符的結(jié)果類型,是某個無符號整型);
類型ptrdiff_t(兩個指針相減運算的結(jié)果類型,是某個有符號整型);
類型wchar_t(寬字符類型,是一個整型,其中足以存放本系統(tǒng)所支持的所有本地環(huán)境中的字符集的所有編碼值。這里還保證空字符的編碼值為0);
符號常量NULL(空指針值);
宏offsetor(這是一個帶參數(shù)的宏,第一個參數(shù)應(yīng)是一個結(jié)構(gòu)類型,第二個參數(shù)應(yīng)是結(jié)構(gòu)成員名。
offsetor(s,m)
求出成員m在結(jié)構(gòu)類型t的變量里的偏移量)。
注:其中有些定義也出現(xiàn)在其他頭文件里(如NULL)。
二、錯誤信息(
三、輸入輸出函數(shù)(
文件打開和關(guān)閉:
FILE *fopen(const char *filename, const char *mode); int fclose(FILE * stream);
字符輸入輸出:
int fgetc(FILE *fp); int fputc(int c, FILE *fp);
getc和putc與這兩個函數(shù)類似,但通過宏定義實現(xiàn)。通常有下面定義:
#define getchar() getc(stdin) #define putchar(c) putc(c, stdout) intungetc(intc,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);
四、數(shù)學函數(shù)(
1.三角函數(shù):
三角函數(shù) | sin | cos | tan |
反三角函數(shù) | asin | acos | atan |
雙曲函數(shù) | sinh | cosh | tanh |
2.指數(shù)和對數(shù)函數(shù):
以e為底的指數(shù)函數(shù) | exp |
自然對數(shù)函數(shù) | log |
以10為底的對數(shù)函數(shù) | log10 |
3.其他函數(shù):
平方根 | sqrt |
絕對值 | fabs |
乘冪,第一個參數(shù)作為底,第二個是指數(shù) | double pow(double, double) |
實數(shù)的余數(shù),兩個參數(shù)分別是被除數(shù)和除數(shù) | double fmod(double, double) |
注:所有上面未給出類型特征的函數(shù)都取一個參數(shù),其參數(shù)與返回值都是double類型。
下面函數(shù)返回雙精度值(包括函數(shù)ceil和floor)。在下表里,除其中有特別說明的參數(shù)之外,所有函數(shù)的其他參數(shù)都是double類型。
函數(shù)原型 | 意義解釋 |
ceil(x) | 求出不小于x的最小整數(shù)(返回與這個整數(shù)對應(yīng)的double值) |
floor(x) | 求出不大于x的最大整數(shù)(返回與這個整數(shù)對應(yīng)的double值) |
atan2(y, x) | 求出tan-1(y/x),其值的范圍是[-pai,pai] |
ldexp(x, int n) | 求出x*2n |
frexp(x, int*exp) | 把x分解為y*2n,是位于區(qū)間[1/2,1)里的一個小數(shù),作為函數(shù)結(jié)果返回,整數(shù)n通過指針*exp返回(應(yīng)提供一個int變量地址)。當x為0時這兩個結(jié)果的值都是0 |
modf(x, double *ip) |
把x分解為小數(shù)部分和整數(shù)部分,小數(shù)部分作為函數(shù)返回值,整數(shù)部分通過指針*ip返回。 |
五、字符處理函數(shù)(
見下表:
int isalpha(c) | c是字母字符 |
int isdigit(c) | c是數(shù)字字符 |
int isalnum(c) | c是字母或數(shù)字字符 |
int isspace(c) | c是空格、制表符、換行符 |
int isupper(c) | c是大寫字母 |
int islower(c) | c是小寫字母 |
int iscntrl(c) | c是控制字符 |
int isprint(c) | c是可打印字符,包括空格 |
int isgraph(c) | c是可打印字符,不包括空格 |
int isxdigit(c) | c是十六進制數(shù)字字符 |
int ispunct(c) | c是標點符號 |
int tolower(int c) | 當c是大寫字母時返回對應(yīng)小寫字母,否則返回c本身 |
int toupper(int c) | 當c是小寫字母時返回對應(yīng)大寫字母,否則返回c本身 |
注:條件成立時這些函數(shù)返回非0值。最后兩個轉(zhuǎn)換函數(shù)對于非字母參數(shù)返回原字符。
六、字符串函數(shù)(
1.字符串函數(shù)
所有字符串函數(shù)列在下表里,函數(shù)描述采用如下約定:s、t表示 (char *)類型的參數(shù),cs、ct表示(const char*)類型的參數(shù)(它們都應(yīng)表示字符串)。n表示size_t類型的參數(shù)(size_t是一個無符號的整數(shù)類型),c是整型參數(shù)(在函數(shù)里轉(zhuǎn)換到char):
函數(shù)原型 | 意義解釋 |
size_t strlen(cs) | 求出cs的長度 |
char *strcpy(s,ct) | 把ct復(fù)制到s。要求s指定足夠大的字符數(shù)組 |
char *strncpy(s,ct,n) | 把ct里的至多n個字符復(fù)制到s。要求s指定一個足夠大的字符數(shù)組。如果ct里的字符不夠n個,就在s里填充空字符。 |
char *strcat(s,ct) | 把ct里的字符復(fù)制到s里已有的字符串之后。s應(yīng)指定一個保存著字符串,而且足夠大的字符數(shù)組。 |
char *strncat(s,ct,n) | 把ct里的至多n個字符復(fù)制到s里已有的字符串之后。s應(yīng)指定一個保存著字符串,而且足夠大的字符數(shù)組。 |
int strcmp(cs,ct) | 比較字符串cs和ct的大小,在cs大于、等于、小于ct時分別返回正值、0、負值。 |
int strncmp(cs,ct,n) | 比較字符串cs和ct的大小,至多比較n個字符。在cs大于、等于、小于ct時分別返回正值、0、負值。 |
char *strchr(cs,c) | 在cs中查尋c并返回c第一個出現(xiàn)的位置,用指向這個位置的指針表示。當cs里沒有c時返回值NULL |
char *strrchr(cs,c) | 在cs中查尋c并返回c最后一個出現(xiàn)的位置,沒有時返回NULL |
size_t strspn(cs,ct) | 由cs起確定一段全由ct里的字符組成的序列,返回其長度 |
size_t strcspn(cs,ct) | 由cs起確定一段全由非ct里的字符組成的序列,返回其長度 |
char *strpbrk(cs,ct) | 在cs里查尋ct里的字符,返回第一個滿足條件的字符出現(xiàn)的位置,沒有時返回NULL |
char *strstr(cs,ct) | 在cs中查尋串ct(查詢子串),返回ct作為cs的子串的第一個出現(xiàn)的位置,ct未出現(xiàn)在cs里時返回NULL |
char *strerror(n) | 返回與錯誤編號n相關(guān)的錯誤信息串(指向該錯誤信息串的指針) |
char *strtok(s,ct) | 在s中查尋由ct中的字符作為分隔符而形成的單詞 |
2.存儲區(qū)操作
函數(shù)原型 | 意義解釋 |
void *memcpy(s,ct,n) | 從ct處復(fù)制n個字符到s處,返回s |
void *memmove(s,ct,n) | 從ct處復(fù)制n個字符到s處,返回s,這里的兩個段允許重疊 |
int memcmp(cs,ct,n) | 比較由cs和ct開始的n個字符,返回值定義同strcmp |
void *memchr(cs,c,n) | 在n個字符的范圍內(nèi)查尋c在cs中的第一次出現(xiàn),如果找到,返回該位置的指針值,否則返回NULL |
void *memset(s,c,n) | 將s的前n個字符設(shè)置為c,返回s |
七、功能函數(shù)(
1.隨機數(shù)函數(shù):
函數(shù)原型 | 意義解釋 |
int rand(void) | 生成一個0到RAND_MAX的隨機整數(shù) |
void srand(unsigned seed) | 用seed為隨后的隨機數(shù)生成設(shè)置種子值 |
2.動態(tài)存儲分配函數(shù):
函數(shù)原型 | 意義解釋 |
void *calloc(size_t n, size_t size) | 分配一塊存儲,其中足以存放n個大小為size的對象,并將所有字節(jié)用0字符填充。返回該存儲塊的地址。不能滿足時返回NULL |
void *malloc(size_t size) | 分配一塊足以存放大小為size的存儲,返回該存儲塊的地址,不能滿足時返回NULL |
void *realloc(void *p, size_t size) | 將p所指存儲塊調(diào)整為大小size,返回新塊的地址。如能滿足要求,新塊的內(nèi)容與原塊一致;不能滿足要求時返回NULL,此時原塊不變 |
void free(void *p) | 釋放以前分配的動態(tài)存儲塊 |
3.幾個整數(shù)函數(shù)
幾個簡單的整數(shù)函數(shù)見下表,div_t和ldiv_t是兩個預(yù)定義結(jié)構(gòu)類型,用于存放整除時得到的商和余數(shù)。div_t類型的成分是int類型的quot和rem,ldiv_t類型的成分是long類型的quot和rem。
函數(shù)原型 | 意義解釋 |
int abs(int n) | 求整數(shù)的絕對值 |
long labs(long n) | 求長整數(shù)的絕對值 |
div_t div(int n, int m) | 求n/m,商和余數(shù)分別存放到結(jié)果結(jié)構(gòu)的對應(yīng)成員里 |
ldiv_t ldiv(long n, long m) | 同上,參數(shù)為長整數(shù) |
4.數(shù)值轉(zhuǎn)換
函數(shù)原型 | 意義解釋 |
double atof(const char *s) | 由串s構(gòu)造一個雙精度值 |
int atoi(const char *s) | 由串s構(gòu)造一個整數(shù)值 |
long atol(const char *s) | 由串s構(gòu)造一個長整數(shù)值 |
5.執(zhí)行控制
1)非正常終止函數(shù)abort。
原型是:
void abort(void);
2)正常終止函數(shù)exit。
原型是:
void exit(int status);
導(dǎo)致程序按正常方式立即終止。status作為送給執(zhí)行環(huán)境的出口值,0表示成功結(jié)束,兩個可用的常數(shù)為EXIT_SUCCESS,EXIT_FAILURE。
3)正常終止注冊函數(shù)atexit。
原型是:
int atexit(void (*fcn)(void))
可用本函數(shù)把一些函數(shù)注冊為結(jié)束動作。被注冊函數(shù)應(yīng)當是無參無返回值的函數(shù)。注冊正常完成時atexit返回值0,否則返回非零值。
6.與執(zhí)行環(huán)境交互
1)向執(zhí)行環(huán)境傳送命令的函數(shù)system。
原型是:
int system(const char *s);
把串s傳遞給程序的執(zhí)行環(huán)境要求作為系統(tǒng)命令執(zhí)行。如以NULL為參數(shù)調(diào)用,函數(shù)返回非0表示環(huán)境里有命令解釋器。如果s不是NULL,返回值由實現(xiàn)確定。
2)訪問執(zhí)行環(huán)境的函數(shù)getenv。
原型是:
char *getenv(const char *s);
從執(zhí)行環(huán)境中取回與字符串s相關(guān)聯(lián)的環(huán)境串。如果找不到就返回NULL。本函數(shù)的具體結(jié)果由實現(xiàn)確定。在許多執(zhí)行環(huán)境里,可以用這個函數(shù)去查看“環(huán)境變量”的值。
7.常用函數(shù)bsearch和qsort
1)二分法查找函數(shù)bsearch:
void *bsearch(const void *key, const void *base, size_t n, size_t size, int (*cmp)(const void *keyval, const void *datum));
函數(shù)指針參數(shù)cmp的實參應(yīng)是一個與字符串比較函數(shù)strcmp類似的函數(shù),確定排序的順序,當?shù)谝粋€參數(shù)keyval比第二個參數(shù)datum大、相等或小時分別返回正、零或負值。
2)快速排序函數(shù)qsort:
qsort對于比較函數(shù)cmp的要求與bsearch一樣。設(shè)有數(shù)組base[0],...,base[n-1],元素大小為size。用qsort可以把這個數(shù)組的元素按cmp確定的上升順序重新排列。
void qsort(void *base, size_t n, size_t size, int (*cmp)(const void *, const void *));
審核編輯:湯梓紅
-
C語言
+關(guān)注
關(guān)注
180文章
7610瀏覽量
137232 -
文件
+關(guān)注
關(guān)注
1文章
569瀏覽量
24775 -
字符
+關(guān)注
關(guān)注
0文章
233瀏覽量
25230 -
函數(shù)
+關(guān)注
關(guān)注
3文章
4341瀏覽量
62796 -
標準庫
+關(guān)注
關(guān)注
0文章
31瀏覽量
7502
原文標題:C語言常用標準庫
文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論