頭文件唯一的目的是提供宏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(); 取得目前的時間