C语言——标准库
C語言標準庫
宗旨:技術的學習是有限的,分享的精神是無限的。
<assert.h> ???斷言
<ctype.h> ???字符類測試
<errno.h> ??(部分)庫函數拋出的錯誤代碼
<float.h> ????浮點數運算
<limits.h> ???檢測整型數據類型值范圍
<locale.h> ???本土化
<math.h>??? ?數學函數
<setjmp.h>? ?“非局部跳轉”
<signal.h>?? ?信號
<stdarg.h>?? ?可變參數列表
<stddef.h> ???一些常數,類型和變量
<stdio.h>??? ?輸入和輸出
<stdlib.h>??? ?實用功能
<string.h> ????字符串函數
<time.h>???? ?時間和日期函數
?
一、assert.h
頭文件<assert.h>唯一的目的是提供宏assert的定義。如果斷言非真(expression==0),則程序會在標準錯誤流輸出提示信息,并使程序異常中止調用abort() 。
定義:void assert (int expression);
//#defineNDEBUG
#include<assert.h>
intmain(int argc, char* argv[])
{
?????? int a = 12;
?????? int b = 24;
?????? assert( a > b );
?????? printf("a is larger than b!");
?????? return 0;
}
上面的程序會發現程序中止,printf并未執行,且有這樣的輸出:?main: Assertion `a > b' failed.?原因就是因為a其實小于b,導致斷言失敗,assert 輸出錯誤信息,并調用abort()中止了程序執行。
?
二、ctype.h
<ctype.h> 主要提供兩類重要的函數:字符測試函數和字符大小轉化函數。提供的函數中都以int類型為參數,并返回一個int類型的值。實參類型應該隱式轉換或者顯示轉換為int類型。
int isalnum(int c);?判斷是否是字母或數字。
int isalpha(int c);?判斷是否是字母。
int iscntrl(int c);?判斷是否是控制字符。
int isdigit(int c);?判斷是否是數字。
int isgraph(int c);?判斷是否是可顯示字符。
int islower(int c);?判斷是否是小寫字母。
int isupper(int c);?判斷是否是大寫字母。
int isprint(int c);?判斷是否是可顯示字符。
int ispunct(int c);?判斷是否是標點字符。
int isspace(int c);?判斷是否是空白字符
int isxdigit(int c);?判斷字符是否為16進制。
int tolower(int c);?轉換為小寫字母。
int toupper(int c);?轉換為大寫字母。
?
三、error.h
error.h 是 C語言 C標準函式庫里的頭文件,定義了通過錯誤碼來返回錯誤信息的宏:errno 宏定義為一個int型態的左值, 包含任何函數使用errno功能所產生的上一個錯誤碼。
一些表示錯誤碼,定義為整數值的宏:
EDOM 源自于函數的參數超出范圍,例如sqrt(-1)
ERANGE 源自于函數的結果超出范圍,例如s trtol("0xfffffffff",NULL,0)
EILSEQ 源自于不合??法的字符順序,例如wcstombs(str, L"\xffff", 2)
?
四、float.h
float頭文件定義了浮點型數值的最大最小限 浮點型數值以下面的方式定義:符號-value E 指數 符號是正負,value是數字的值?;下面的值是用#define定義的,這些值是詳細的實現,但是可能沒有比這里給出的更詳細,在所有實例里FLT指的是float,DBL是double,LDBL指的是longdouble
?
五、<limits.h>取值范圍
CHAR_BIT?一個ASCII字符長度
SCHAR_MIN?字符型最小值
SCHAR_MAX?字符型最大值
UCHAR_MAX?無符號字符型最大值
CHAR_MIN
CHAR_MAX?
char字符的最大最小值,如果char字符正被表示有符號整數。它們的值就跟有符號整數一樣。 否則char字符的最小值就是0,最大值就是無符號char字符的最大值。
MB_LEN_MAX?一個字符所占最大字節數
SHRT_MIN?最小短整型
SHRT_MAX?最大短整形
USHRT_MAX?最大無符號短整型
INT_MIN?最小整型
INT_MAX?最大整形
UINT_MAX?最大無符號整型
LONG_MIN?最小長整型
LONG_MAX?最大長整型
ULONG_MAX?無符號長整型
?
六、<locale.h>本土化
國家、文化和語言規則集稱為區域設置,<locale.h>頭文件中定義了區域設置相關的函數。setlocale函數用于設置或返回當前的區域特性,localeconv用于返回當前區域中的數字和貨幣信息(保存在struct lconv結構實例中)。setlocale的第一個實參指定要改變的區域行為類別,預定義的setlocale類別有:
LC_ALL全部本地化信息
LC_COLLATE影響strcoll和strxfrm
LC_CTYPE影響字符處理函數和多行字符處理函數
LC_MONETARY影響localeconv返回的貨幣格式化信息
LC_NUMERIC影響格式化輸入輸出字符中的小數點符號
LC_TIME影響strftime函數
<locale.h>?頭文件中提供了2個函數?
setlocale()?設置或恢復本地化信息?
localeconv()?返回當前地域設置的信息
setlocale(constant,location)?用法?
如果這個函數成功執行,將返回當前的場景屬性;如果執行失敗,將返回False。
constant?參數 (必要參數。指定設置的場景信息)
LC_ALL?–所有下屬的常量
LC_COLLATE?–排列順序
LC_CTYPE?–字符分類和轉換(例如:將所有的字符轉換成小寫或大寫形式)
LC_MESSAGES?–系統信息格式
LC_MONETARY?–貨幣 / 通貨格式
LC_NUMERIC?–數值格式
LC_TIME?–日期和時間格式
location?(必要參數)必要參數。指定需要進行場景信息設置的國家或區域。它可以由一個字符串或一個數組組成。如果本地區域是一個數組,那么setlocale()函數將嘗試每 個數組元素直到它從中獲取有效的語言和區域代碼信息為止。如果一個區域處于不同操作系統中的不同名稱下,那么這個參數將非常有用。
structlconv *localeconv(void);?用法
localeconv返回lconv結構指針lconv結構介紹: 保存格式化的數值信息,保存數值包括貨幣和非貨幣的格式化信息,localeconv返回指向該對象的指針,以下為結構中的成員及信息:
char*decimal_point;?數字的小數點號
char*thousands_sep;?數字的千分組分隔符
每個元素為相應組中的數字位數,索引越高的元素越靠左邊。一個值為CHAR_MAX的元素表示沒有更多的分組了。一個值為0的元素表示前面的元素能用在靠左邊的所有分組中
char*grouping;?數字分組分隔符
char*int_curr_symbol;?前面的三個字符ISO 4217中規定的貨幣符號,第四個字符是分隔符,第五個字符是'\0' */
char*currency_symbol;?本地貨幣符號
char*mon_decimal_point;?貨幣的小數點號
char*mon_thousands_sep;?千分組分隔符
char*mon_grouping;?類似于grouping元素
char*positive_sign;?正幣值的符號
char*negative_sign;?負幣值的符號
charint_frac_digits;?國際幣值的小數部分
charfrac_digits;?本地幣值的小數部分
charp_cs_precedes;?如果currency_symbol放在正幣值之前則為1,否則為0
charp_sep_by_space;?當且僅當currency_symbol與正幣值之間用空格分開時為1
charn_cs_precedes;?< 如果currency_symbol放在負幣值之前則為1,否則為0/dt>
charn_sep_by_space;?當且僅當currency_symbol與負幣值之間用空格分開時為1
charp_sign_posn;?格式化選項
0 - 在數量和貨幣符號周圍的圓括號?
1 - 數量和貨幣符號之前的 + 號?
2 - 數量和貨幣符號之后的 + 號?
3 - 貨幣符號之前的 + 號?
4 - 貨幣符號之后的 + 號
charn_sign_posn?格式化選項
0 - 在數量和貨幣符號周圍的圓括號?
1 - 數量和貨幣符號之前的 - 號?
2 - 數量和貨幣符號之后的 - 號?
3 - 貨幣符號之前的 - 號?
4 - 貨幣符號之后的 - 號
最后提示:可以使用setlocale(LC_ALL,NULL)函數將場景信息設置為系統默認值。
?
七、<math.h>是C語言中的數學函數庫
三角函數
double sin(double x);?正弦
double cos(double x);?余弦
double tan(double x);?正切
*cot三角函數,可以使用tan(PI/2-x)來實現。
反三角函數
double asin(double x);結果介于[-PI/2, PI/2]?
double acos(double x);?結果介于[0, PI]?
double atan(double x);?
反正切(主值), 結果介于[-PI/2, PI/2]?
double atan2(double y,double);?
反正切(整圓值), 結果介于[-PI, PI]
雙曲三角函數
double sinh(double x);?計算雙曲正弦
double cosh(double x);?計算雙曲余弦
double tanh(double x);?計算雙曲正切
指數與對數
double exp(double x);?求取自然數e的冪
double sqrt(double x);?開平方
double log(double x);?以e為底的對數
double log10(double x);?以10為底的對數
double pow(double x, double y);?
計算以x為底數的y次冪?
float powf(float x, float y);?
與pow一致,輸入與輸出皆為浮點數
取整
double ceil(double);?取上整
double floor(double);?取下整
標準化浮點數
double frexp(double f, int *p);?
標準化浮點數, f = x * 2^p, 已知f求x, p ( x介于[0.5,1] )?
double ldexp(double x, int p);?
與frexp相反, 已知x, p求f
取整與取余
double modf(double, double*);?
將參數的整數部分通過指針回傳, 返回小數部分?
double fmod(double, double);?
返回兩參數相除的余數
?
八、<setjmp.h> “非局部跳轉”
在該頭文件中定義了一種特別的函數調用和函數返回順序的方式。這種方式不同于以往的函數調用和返回順序,?
它允許程序流程立即從一個深層嵌套的函數中返回。
<setjmp.h> 中定義了兩個宏:
int setjmp(jmp_buf env); /*設置調轉點*/?
longjmp(jmp_buf jmpb, int retval); /*跳轉*/?
宏setjmp的功能是將當前程序的狀態保存在結構env ,為調用宏longjmp設置一個跳轉點。setjmp將當前信息保存在env中供longjmp使用。其中env是jmp_buf結構類型的。?
Demo :
#include? <stdio.h>
#include? <setjmp.h>
staticjmp_buf buf;
voidsecond(void) {
??? printf("second\n");???????
?????? // 打印
??? longjmp(buf,1);???????????
?????? // 跳回setjmp的調用處
?????? - 使得setjmp返回值為1
}
?void first(void) {
??? second();
??? printf("first\n");?????????
?????? // 不可能執行到此行
}
?int main() {??
??? if ( ! setjmp(buf) ) {
??????? first();??????????????
?????? // 進入此行前,setjmp返回0
??? } else {?????????????????
?????? // 當longjmp跳轉回,
?????? setjmp返回1,因此進入此行
??????? printf("main\n");?
????????????? // 打印
??? }
???? return 0;
}
直接調用setjmp時,返回值為0,這一般用于初始化(設置跳轉點時)。以后再調用longjmp宏時用env變量進行跳轉。程序會自動跳轉到setjmp宏的返回語句處,此時setjmp的返回值為非0,由longjmp的第二個參數指定。?
一般地,宏setjmp和longjmp是成對使用的,這樣程序流程可以從一個深層嵌套的函數中返回。
?
九、<signal.h>信號
在signal.h頭文件中,提供了一些函數用以處理執行過程中所產生的信號。
宏:
SIG_DFL
SIG_ERR
SIG_IGN
SIGABRT
SIGFPE
SIGILL
SIGINT
SIGSEGV
SIGTERM
函數:
signal();
raise();
變量:
typedefsig_atomic_t
sig_atomic_t?類型是int類型,用于接收signal函數的返回值。
以SIG_開頭的宏用于定義信號處理函數
SIG_DFL?默認信號處理函數。
SIG_ERR表示一個錯誤信號,當signal函數調用失敗時的返回值。
SIG_IGN信號處理函數,表示忽略該信號。
SIG開頭的宏是用來在下列情況下,用來表示一個信號代碼:
SIGABRT異常終止(abort函數產生)。
SIGFPE浮點錯誤(0作為除數產生的錯誤,非法的操作)。
SIGILL非法操作(指令)。
SIGINT交互式操作產生的信號(如CTRL - C)。
SIGSEGV無效訪問存儲(片段的非法訪問,內存非法訪問)。
SIGTERM終止請求。
signal?函數
void(*signal(intsig,void (*func)(int)))(int);
上面的函數定義中,sig 表示一個信號代碼(相當于暗號類別),即是上面所定義的SIG開頭的宏。當有信號出現(即當收到暗號)的時候,參數func所定義的函數就會被調用。如果func等于SIG_DFL,則表示調用默認的處理函數。如果等于SIG_IGN,則表示這個信號被忽略(不做處理)。如果func是用戶自定義的函數,則會先調用默認的處理函數,再調用用戶自己定義的函數。 自定義函數,有一個參數,參數類型為int,用來表示信號代碼(暗號類別)。同時,函數必須以return、abort、exit 或longjump等語句結束。當自定義函數運行結束,程序會繼續從被終止的地方繼續運行。(除非信號是SIGFPE導致結果未定義,則可能無法繼續運行)
如果調用signal函數成功,則會返回一個指針,該指針指向為所指定的信號類別的所預先定義的信號處理器。?
如果調用失敗,則會返回一個SIG_ERR,同時errno的值也會被相應的改變。
raise函數
intraise(int sig);
發出一個信號sig。信號參數為SIG開頭的宏。
如果調用成功,返回0。否則返回一個非零值。
?
十、<stdarg.h>可變參數
<stdarg.h>頭文件定義了一些宏,當函數參數未知時去獲取函數的參數
變量:typedefva_list
宏:
va_start()
va_arg()
va_end()
變量和定義
va_list類型通過stdarg宏定義來訪問一個函數的參數表,參數列表的末尾會用省略號省略?
聲明:void va_start(va_list ap, last_arg);
用va_arg和va_end宏初始化參數ap,last_arg是傳給函數的固定參數的最后一個,省略號之前的那個參數 注意va_start必須在使用va_arg和va_end之前調用
聲明:type va_arg(va_list ap, type);
用type類型擴展到參數表的下個參數
注意ap必須用va_start初始化,如果沒有下一個參數,結果會是undefined
聲明:void va_end(va_list ap); 允許一個有參數表(使用va_start宏)的函數返回,如果返回之前沒有調用va_end,結果會是undefined。參數變量列表可能不再使用(在沒調用va_start的情況下調用va_end)
?
十一、<stddef.h>一些常數,類型和變量
<stddef.h>頭文件定義了一些標準定義,許多定義也會出現在其他的頭文件里
宏命令:NULL 和 offsetof()?
變量:
typedef ptrdiff_t
typedef size_t
typedef wchar_t
變量和定義:
ptrdiff_t是兩個指針相減的結果
size_t是sizeof一個關鍵詞得到的無符號整數值
wchar_t是一個寬字符常量的大小,是整數類型
NULL是空指針的常量值
offsetof(type, member-designator);這個宏返回一個結構體成員相對于結構體起始地址的偏移量(字節為單位),type是結構體的名字,member-designator是結構體成員的名字。
?
十二、<stdio.h>頭文件定義了用于輸入和輸出的函數、類型和宏。
最重要的類型是用于聲明文件指針的FILE。另外兩個常用的類型是 size_t和fpos_t,size_t是由運算符sizeof產生的無符號整類型;fpos_t類型定義能夠唯一說明文件中的每個位置的對象。由頭部 定義的最有用的宏是EOF,其值代表文件的結尾。
變量:?
typedef size_t
typedef FILE
typedef fpos_t
常量 :?
NULL?空值
_IOFBF?表示完全緩沖?
_IOLBF?表示線緩沖?
_IONBF?表示無緩存
BUFSIZ?setbuf函數所使用的緩沖區的大小
EOF?EOF是負整數表示ENDOF FILE
FOPEN_MAX?(20)同時打開的文件的最大數量
FILENAME_MAX?文件名的最大長度
L_tmpnam整數,最大長度的臨時文件名
SEEK_CUR取得目前文件位置
SEEK_END將讀寫位置移到文件尾時
SEEK_SET將讀寫位置移到文件開頭
TMP_MAXtmpnam最多次數
stderr標準錯誤流,默認為屏幕, 可輸出到文件。
stdin標準輸入流,默認為鍵盤
stdout標準輸出流,默認為屏幕?
所有函數(點擊可查看介紹和DEMO) :?
?? clearerr();?復位錯誤標志
?? fclose();?關閉一個流。
?? feof();?檢測文件結束符
?? ferror();?檢查流是否有錯誤
?? fflush();更新緩沖區
?? fgetpos();?移動文件流的讀寫位置
?? fopen();打開文件
?? fread();?從文件流讀取數據
?? freopen();?打開文件
?? fseek();?移動文件流的讀寫位置
?? fsetpos();定位流上的文件指針
?? ftell();?取得文件流的讀取位置
?? fwrite();?將數據寫至文件流
?? remove();?刪除文件
?? rename();?更改文件名稱或位置
?? rewind();?重設讀取目錄的位置為開頭位置
?? setbuf();?把緩沖區與流相聯
?? setvbuf();?把緩沖區與流相關
?? tmpfile();?以wb+形式創建一個臨時二進制文件
?? tmpnam();? 產生一個唯一的文件名
?? fprintf();?格式化輸出數據至文件
?? fscanf();?格式化字符串輸入
?? printf();?格式化輸出數據
?? scanf();?格式輸入函數
?? sprintf();?格式化字符串復制
?? sscanf();?格式化字符串輸入
?? vfprintf();?格式化輸出數據至文件
?? vprintf();?格式化輸出數據
?? vsprintf();?格式化字符串復制
?? fgetc();?由文件中讀取一個字符
?? fgets();?文件中讀取一字符串
?? fputc();?將一指定字符寫入文件流中
?? fputs();?將一指定的字符串寫入文件內
?? getc();?由文件中讀取一個字符
?? getchar();?由標準輸入設備內讀進一字符
?? gets();?由標準輸入設備內讀進一字符串
?? putc();?將一指定字符寫入文件中
?? putchar();?將指定的字符寫到標準輸出設備
?? puts();?送一字符串到流stdout中
?? ungetc();? 將指定字符寫回文件流中
?? perror();?打印出錯誤原因信息字符串
?
十三、<stdlib.h>實用功能
<stdlib.h>頭文件里包含了C語言的中最常用的系統函數
宏:
NULL?空
EXIT_FAILURE?失敗狀態碼
EXIT_SUCCESS?成功狀態碼
RAND_MAX?rand的最大返回值
MB_CUR_MAX?多字節字符中的最大字節數
變量:
typedefsize_t是unsignedinteger類型
typedefwchar_t?一個寬字符的大小
structdiv_t?是結構體類型 作為div函數的返回類型
structldiv_t是結構體類型 作為ldiv函數的返回類型
函數:
字符串函數
atof();?將字符串轉換成浮點型數
atoi();?將字符串轉換成整型數
atol();?將字符串轉換成長整型數
strtod();?將字符串轉換成浮點數
strtol();?將字符串轉換成長整型數
strtoul();?將字符串轉換成無符號長整型數
?
?
內存控制函數
calloc();?配置內存空間
free();?釋放原先配置的內存
malloc();?配置內存空間
realloc();?重新分配主存
?
環境函數
abort();?異常終止一個進程
atexit();設置程序正常結束前調用的函數
exit();?正常結束進程
getenv();?取得環境變量內容
system();?執行shell命令
?
?
搜索和排序函數
bsearch();?二元搜索
qsort();?利用快速排序法排列數組
?
數學函數
abs();?計算整型數的絕對值
div();?將兩個整數相除, 返回商和余數
labs();?取長整型絕對值
ldiv();兩個長整型數相除, 返回商和余數
rand();?隨機數發生器
srand();?設置隨機數種子
?
多字節函數
mblen();?根據locale的設置確定字符的字節數
mbstowcs();?把多字節字符串轉換為寬字符串
mbtowc();?把多字節字符轉換為寬字符
wcstombs();?把寬字符串轉換為多字節字符串
wctomb();?把寬字符轉換為多字節字符
<string.h>字符串函數
<stdlib.h>頭文件里包含了C語言的最常用的字符串操作函數
宏:
NULL?空
變量:
typedefsize_t
函數:
memchr();在某一內存范圍中查找一特定字符
memcmp();?比較內存內容
memcpy();?拷貝內存內容
memmove();?拷貝內存內容
memset();?將一段內存空間填入某值
strcat();?連接兩字符串
strncat();?連接兩字符串
strchr();?查找字符串中第一個出現的指定字符
strcmp();?比較字符串
strncmp();比較2個字符串的前N個字符
strcoll();?采用目前區域的字符排列比較字符串
strcpy();?拷貝字符串
strncpy();?拷貝字符串
strcspn();?返回字符連續不含指定字符的字符數
strerror();?返回錯誤原因的描述字符串
strlen();?計算字符串長度
strpbrk();?查找字符串中第一個出現的指定字符
strrchr();?查找字符串中最后出現的指定字符
strspn();返回字符串連續不含指定字符的字符數
strstr();?在一字符串中查找指定的字符串
strtok();?分割字符串
strxfrm();?轉換字符串
?
十四、<time.h>時間和日期函數
<time.h>是C標準函數庫中獲取時間與日期、對時間與日期數據操作及格式化的頭文件。
宏:
NULL?null是一個null指針常量的值
CLOCKS_PER_SEC?每秒的時鐘數
變量:
typedefsize_t?類型定義
typedefclock_t類型定義
structtm?結構體
struct tm?
{
int tm_sec;?/* 秒 – 取值區間為[0,59] */
int tm_min;?/* 分 - 取值區間為[0,59] */
int tm_hour;?/* 時 - 取值區間為[0,23] */
int tm_mday;?/* 一個月中的日期 - 取值區間為[1,31] */
int tm_mon;?/* 月份(從一月開始,0代表一月) - 取值區間為[0,11] */
int tm_year;?/* 年份,其值等于實際年份減去1900*/
int tm_wday;?/* 星期 – 取值區間為[0,6],其中0代表星期天,1代表星期一,以此類推 */
int tm_yday;?/* 從每年的1月1日開始的天數 – 取值區間為[0,365],其中0代表1月1日,1代表1月2日,以此類推 */
int tm_isdst;?/* 夏令時標識符,實行夏令時的時候,tm_isdst為正。不實行夏令時的進候,tm_isdst為0;不了解情況時,tm_isdst()為負。*/?
};
函數:
asctime();?將時間和日期以字符串格式表示
clock();?確定處理器時間
ctime();?把日期和時間轉換為字符串
difftime();?計算兩個時刻之間的時間差
gmtime();?把日期和時間轉換為(GMT)時間
localtime();取得當地目前時間和日期
mktime();將時間結構數據轉換成經過的秒數
strftime();?將時間格式化
time();?取得目前的時間
?
總結
- 上一篇: Tomcat日志
- 下一篇: tomcat 日志切割