斷言
頭文件唯一的目的是提供宏assert的定義。如果斷言非真(expression==0),則程序會在標准錯誤流輸出提示信息,並使程序異常中止調用abort() 。
定義:void assert (int expression);
//#define NDEBUG
#include
int main(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()中止了程序執行。
字符類測試
主要提供兩類重要的函數:字符測試函數和字符大小轉化函數。提供的函數中都以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 是 C語言 C標准函式庫裡的頭文件,定義了通過錯誤碼來返回錯誤信息的宏:
errno 宏定義為一個int型態的左值, 包含任何函數使用errno功能所產生的上一個錯誤碼。
一些表示錯誤碼,定義為整數值的宏:
EDOM 源自於函數的參數超出范圍,例如 sqrt(-1)
ERANGE 源自於函數的結果超出范圍,例如s trtol("0xfffffffff",NULL,0)
EILSEQ 源自於不合??法的字符順序,例如 wcstombs(str, L"\xffff", 2)
浮點數運算
float頭文件定義了浮點型數值的最大最小限 浮點型數值以下面的方式定義:符號-value E 指數 符號是正負,value是數字的值
下面的值是用#define定義的,這些值是詳細的實現,但是可能沒有比這裡給出的更詳細,
在所有實例裡FLT指的是float,DBL是double,LDBL指的是long double
FLT_ROUNDS
定義浮點型數值四捨五入的方式,-1是不確定,0是向0,1是向最近,2是向正無窮大,3是負無窮大
FLT_RADIX 2
定義指數的基本表示(比如base-2是二進制,base-10是十進制表示法,16是十六進制)
FLT_MANT_DIG,DBL_MANT_DIG,LDBL_MANT_DIG
定義數值裡數字的個數
FLT_DIG 6,DBL_DIG 10,LDBL_DIG 10
在四捨五入之後能不更改表示的最大小數位
FLT_MIN_EXP,DBL_MIN_EXP,LDBL_MIN_EXP
FLT_RADIX 的指數的最小負整數值
FLT_MIN_10_EXP -37,DBL_MIN_10_EXP -37,LDBL_MIN_10_EXP -37
10進制表示法的的指數的最小負整數值
FLT_MAX_EXP ,DBL_MAX_EXP ,LDBL_MAX_EXP
FLT_RADIX 的指數的最大整數值
FLT_MAX_10_EXP +37 ,DBL_MAX_10_EXP ,LDBL_MAX_10_EXP +37 +37
10進制表示法的的指數的最大整數值
FLT_MAX 1E+37,DBL_MAX 1E+37,LDBL_MAX 1E+37
浮點型的最大限
FLT_EPSILON 1E-5,DBL_EPSILON 1E-9,LDBL_EPSILON 1E-9
能表示的最小有符號數
檢測整型數據類型值范圍
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 無符號長整型
本土化
國家、文化和語言規則集稱為區域設置, 頭文件中定義了區域設置相關的函數。setlocale函數用於設置或返回當前的區域特性,localeconv用於返回當前區域中的數字和貨幣信息(保存在struct lconv結構實例中)。setlocale的第一個實參指定要改變的區域行為類別,預定義的setlocale類別有:
LC_ALL
全部本地化信息
LC_COLLATE
影響strcoll和strxfrm
LC_CTYPE
影響字符處理函數和多行字符處理函數
LC_MONETARY
影響localeconv返回的貨幣格式化信息
LC_NUMERIC
影響格式化輸入輸出字符中的小數點符號
LC_TIME
影響strftime函數
頭文件中提供了2個函數
setlocale() 設置或恢復本地化信息
localeconv() 返回當前地域設置的信息
setlocale(constant,location) 用法
如果這個函數成功執行,將返回當前的場景屬性;如果執行失敗,將返回False。
constant 參數 (必要參數。指定設置的場景信息)
LC_ALL – 所有下屬的常量
LC_COLLATE – 排列順序
LC_CTYPE – 字符分類和轉換(例如:將所有的字符轉換成小寫或大寫形式)
LC_MESSAGES – 系統信息格式
LC_MONETARY – 貨幣 / 通貨格式
LC_NUMERIC – 數值格式
LC_TIME – 日期和時間格式
location (必要參數)
必要參數。指定需要進行場景信息設置的國家或區域。它可以由一個字符串或一個數組組成。如果本地區域是一個數組,那麼setlocale()函數將嘗試每 個數組元素直到它從中獲取有效的語言和區域代碼信息為止。如果一個區域處於不同操作系統中的不同名稱下,那麼這個參數將非常有用。
struct lconv *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; 負幣值的符號
char int_frac_digits; 國際幣值的小數部分
char frac_digits; 本地幣值的小數部分
char p_cs_precedes; 如果currency_symbol放在正幣值之前則為1,否則為0
char p_sep_by_space; 當且僅當currency_symbol與正幣值之間用空格分開時為1
char n_cs_precedes; < 如果currency_symbol放在負幣值之前則為1,否則為0/dt>
char n_sep_by_space; 當且僅當currency_symbol與負幣值之間用空格分開時為1
char p_sign_posn; 格式化選項
0 - 在數量和貨幣符號周圍的圓括號
1 - 數量和貨幣符號之前的 + 號
2 - 數量和貨幣符號之後的 + 號
3 - 貨幣符號之前的 + 號
4 - 貨幣符號之後的 + 號
char n_sign_posn 格式化選項
0 - 在數量和貨幣符號周圍的圓括號
1 - 數量和貨幣符號之前的 - 號
2 - 數量和貨幣符號之後的 - 號
3 - 貨幣符號之前的 - 號
4 - 貨幣符號之後的 - 號
最後提示:可以使用setlocale(LC_ALL,NULL)函數將場景信息設置為系統默認值。
數學函數
是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);
返回兩參數相除的余數
“非局部跳轉”
在該頭文件中定義了一種特別的函數調用和函數返回順序的方式。這種方式不同於以往的函數調用和返回順序,
它允許程序流程立即從一個深層嵌套的函數中返回。
中定義了兩個宏:
int setjmp(jmp_buf env); /*設置調轉點*/
longjmp(jmp_buf jmpb, int retval); /*跳轉*/
宏setjmp的功能是將當前程序的狀態保存在結構env ,為調用宏longjmp設置一個跳轉點。setjmp將當前信息保存在env中供longjmp使用。其中env是jmp_buf結構類型的。
Demo :
#include
#include
static jmp_buf buf;
void second(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頭文件中,提供了一些函數用以處理執行過程中所產生的信號。
宏:
SIG_DFL
SIG_ERR
SIG_IGN
SIGABRT
SIGFPE
SIGILL
SIGINT
SIGSEGV
SIGTERM
函數:
signal();
raise();
變量:
typedef sig_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(int sig,void (*func)(int)))(int);
上面的函數定義中,sig 表示一個信號代碼(相當於暗號類別),即是上面所定義的SIG開頭的宏。當有信號出現(即當收到暗號)的時候,參數func所定義的函數就會被調用。如果func等於SIG_DFL,則表示調用默認的處理函數。如果等於SIG_IGN,則表示這個信號被忽略(不做處理)。如果func是用戶自定義的函數,則會先調用默認的處理函數,再調用用戶自己定義的函數。 自定義函數,有一個參數,參數類型為int,用來表示信號代碼(暗號類別)。同時,函數必須以return、abort、exit 或 longjump等語句結束。當自定義函數運行結束,程序會繼續從被終止的地方繼續運行。(除非信號是SIGFPE導致結果未定義,則可能無法繼續運行)
如果調用signal函數成功,則會返回一個指針,該指針指向為所指定的信號類別的所預先定義的信號處理器。
如果調用失敗,則會返回一個SIG_ERR,同時errno的值也會被相應的改變。
raise 函數
int raise(int sig);
發出一個信號sig。信號參數為SIG開頭的宏。
如果調用成功,返回0。否則返回一個非零值。
可變參數列表
頭文件定義了一些宏,當函數參數未知時去獲取函數的參數
變量:typedef va_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)
一些常數,類型和變量
頭文件定義了一些標准定義,許多定義也會出現在其他的頭文件裡
宏命令: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是結構體成員的名字。
輸入和輸出
頭文件定義了用於輸入和輸出的函數、類型和宏。最重要的類型是用於聲明文件指針的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是負整數表示END OF 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(); 打印出錯誤原因信息字符串
實用功能
頭文件裡包含了C語言的中最常用的系統函數
宏:
NULL 空
EXIT_FAILURE 失敗狀態碼
EXIT_SUCCESS 成功狀態碼
RAND_MAX rand的最大返回值
MB_CUR_MAX 多字節字符中的最大字節數
變量:
typedef size_t是unsigned integer類型
typedef wchar_t 一個寬字符的大小
struct div_t 是結構體類型 作為div函數的返回類型
struct ldiv_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(); 把寬字符轉換為多字節字符
字符串函數
頭文件裡包含了C語言的最常用的字符串操作函數
宏:
NULL 空
變量:
typedef size_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(); 轉換字符串
時間和日期函數
是C標准函數庫中獲取時間與日期、對時間與日期數據操作及格式化的頭文件。
宏:
NULL null是一個null指針常量的值
CLOCKS_PER_SEC 每秒的時鐘數
變量:
typedef size_t 類型定義
typedef clock_t類型定義
struct tm 結構體
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(); 取得目前的時間