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>都會被自動包含進來。
這個檔案裡定義:
l 類型size_t (sizeof運算符的結果類型,是某個無符号整型);
l 類型ptrdiff_t(兩個指針相減運算的結果類型,是某個有符号整型);
l 類型wchar_t (寬字元類型,是一個整型,其中足以存放本系統所支援的所有本地環境中的字元集的所有編碼值。這裡還保證空字元的編碼值為0);
l 符号常量NULL (空指針值);
l 宏offsetor (這是一個帶參數的宏,第一個參數應是一個結構類型,第二個參數應是結構成員名。
offsetor(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>)
三角函數:
三角函數 | sin | cos | tan |
反三角函數 | asin | acos | atan |
雙曲函數 | sinh | cosh | tanh |
指數和對數函數:
以e為底的指數函數 | exp |
自然對數函數 | log |
以10為底的對數函數 | log10 |
其他函數:
平方根 | sqrt |
絕對值 | fabs |
乘幂,第一個參數作為底,第二個是指數 | double pow(double, double) |
實數的餘數,兩個參數分别是被除數和除數 | double fmod(double, double) |
注:所有上面未給出類型特征的函數都取一個參數,其參數與傳回值都是double類型。
下面函數傳回雙精度值(包括函數ceil和floor)。在下表裡,除其中有特别說明的參數之外,所有函數的其他參數都是double類型。
函數原型 | 意義解釋 |
ceil(x) | 求出不小于x的最小整數(傳回與這個整數對應的double值) |
floor(x) | 求出不大于x的最大整數(傳回與這個整數對應的double值) |
atan2(y, x) | 求出 tan-1(y/x),其值的範圍是[-pai,pai] |
ldexp(x, int n) | 求出x*2n |
frexp(x, int *exp) | 把 x分解為 y*2n, 是位于區間 [1/2,1)裡的一個小數,作為函數結果傳回,整數n 通過指針*exp傳回(應提供一個int變量位址)。當x 為0時這兩個結果的值都是0 |
modf(x, double *ip) | 把x分解為小數部分和整數部分,小數部分作為函數傳回值,整數部分通過指針*ip傳回。 |
五、字元處理函數(<ctype.h>)
見下表:
int isalpha(c) | c是字母字元 |
int isdigit(c) | c是數字字元 |
int isalnum(c) | c是字母或數字字元 |
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是十六進制數字字元 |
int ispunct(c) | c是标點符号 |
int tolower(int c) | 當c是大寫字母時傳回對應小寫字母,否則傳回c本身 |
int toupper(int c) | 當c是小寫字母時傳回對應大寫字母,否則傳回c本身 |
注:條件成立時這些函數傳回非0值。最後兩個轉換函數對于非字母參數傳回原字元。
六、字元串函數(<string.h>)
字元串函數
所有字元串函數列在下表裡,函數描述采用如下約定:s、t表示 (char *)類型的參數,cs、ct表示(const char*)類型的參數(它們都應表示字元串)。n表示size_t類型的參數(size_t是一個無符号的整數類型),c是整型參數(在函數裡轉換到char):
函數原型 | 意義解釋 |
size_t strlen(cs) | 求出cs的長度 |
char *strcpy(s,ct) | 把ct複制到s。要求s指定足夠大的字元數組 |
char *strncpy(s,ct,n) | 把ct裡的至多n個字元複制到s。要求s指定一個足夠大的字元數組。如果ct裡的字元不夠n個,就在s裡填充空字元。 |
char *strcat(s,ct) | 把ct裡的字元複制到s裡已有的字元串之後。s應指定一個儲存着字元串,而且足夠大的字元數組。 |
char *strncat(s,ct,n) | 把ct裡的至多n個字元複制到s裡已有的字元串之後。s應指定一個儲存着字元串,而且足夠大的字元數組。 |
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第一個出現的位置,用指向這個位置的指針表示。當cs裡沒有c時傳回值NULL |
char *strrchr(cs,c) | 在cs中查尋c并傳回c最後一個出現的位置,沒有時傳回NULL |
size_t strspn(cs,ct) | 由cs起确定一段全由ct裡的字元組成的序列,傳回其長度 |
size_t strcspn(cs,ct) | 由cs起确定一段全由非ct裡的字元組成的序列,傳回其長度 |
char *strpbrk(cs,ct) | 在cs裡查尋ct裡的字元,傳回第一個滿足條件的字元出現的位置,沒有時傳回NULL |
char *strstr(cs,ct) | 在cs中查尋串ct(查詢子串),傳回ct作為cs的子串的第一個出現的位置,ct未出現在cs裡時傳回NULL |
char *strerror(n) | 傳回與錯誤編号n相關的錯誤資訊串(指向該錯誤資訊串的指針) |
char *strtok(s,ct) | 在s中查尋由ct中的字元作為分隔符而形成的單詞 |
存儲區操作
<string.h>還有一組字元數組操作函數(存儲區操作函數),名字都以mem開頭,以某種高效方式實作。在下面原型中,參數s和t的類型是(void *),cs和ct的類型是(const void *),n的類型是size_t,c的類型是int(轉換為unsigned char)。
函數原型 | 意義解釋 |
void *memcpy(s,ct,n) | 從ct處複制n個字元到s處,傳回s |
void *memmove(s,ct,n) | 從ct處複制n個字元到s處,傳回s,這裡的兩個段允許重疊 |
int memcmp(cs,ct,n) | 比較由cs和ct開始的n個字元,傳回值定義同strcmp |
void *memchr(cs,c,n) | 在n個字元的範圍内查尋c在cs中的第一次出現,如果找到,傳回該位置的指針值,否則傳回NULL |
void *memset(s,c,n) | 将s的前n個字元設定為c,傳回s |
七、功能函數(<stdlib.h>)
随機數函數:
函數原型 | 意義解釋 |
int rand(void) | 生成一個0到RAND_MAX的随機整數 |
void srand(unsigned seed) | 用seed為随後的随機數生成設定種子值 |
動态存儲配置設定函數:
函數原型 | 意義解釋 |
void *calloc(size_t n, size_t size) | 配置設定一塊存儲,其中足以存放n個大小為size的對象,并将所有位元組用0字元填充。傳回該存儲塊的位址。不能滿足時傳回NULL |
void *malloc(size_t size) | 配置設定一塊足以存放大小為size的存儲,傳回該存儲塊的位址,不能滿足時傳回NULL |
void *realloc(void *p, size_t size) | 将p所指存儲塊調整為大小size,傳回新塊的位址。如能滿足要求,新塊的内容與原塊一緻;不能滿足要求時傳回NULL,此時原塊不變 |
void free(void *p) | 釋放以前配置設定的動态存儲塊 |
幾個整數函數
幾個簡單的整數函數見下表,div_t和ldiv_t是兩個預定義結構類型,用于存放整除時得到的商和餘數。div_t類型的成分是int類型的quot和rem,ldiv_t類型的成分是long類型的quot和rem。
函數原型 | 意義解釋 |
int abs(int n) | 求整數的絕對值 |
long labs(long n) | 求長整數的絕對值 |
div_t div(int n, int m) | 求n/m,商和餘數分别存放到結果結構的對應成員裡 |
ldiv_t ldiv(long n, long m) | 同上,參數為長整數 |
數值轉換
函數原型 | 意義解釋 |
double atof(const char *s) | 由串s構造一個雙精度值 |
int atoi(const char *s) | 由串s構造一個整數值 |
long atol(const char *s) | 由串s構造一個長整數值 |
執行控制
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,否則傳回非零值。
與執行環境互動
1)向執行環境傳送指令的函數system。
原型是:int system(const char *s);
把串s傳遞給程式的執行環境要求作為系統指令執行。如以NULL為參數調用,函數傳回非0表示環境裡有指令解釋器。如果s不是NULL,傳回值由實作确定。
2)通路執行環境的函數getenv。
原型是:char *getenv(const char *s);
從執行環境中取回與字元串s相關聯的環境串。如果找不到就傳回NULL。本函數的具體結果由實作确定。在許多執行環境裡,可以用這個函數去檢視“環境變量”的值。
常用函數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大、相等或小時分别傳回正、零或負值。