linuxc標準庫
?C 標準庫(C Standard Library)包含了一組頭文件,這些頭文件提供了許多函數和宏,用于處理輸入輸出、字符串操作、數學計算、內存管理等常見編程任務。。
頭文件 功能簡介 <stdio.h> 標準輸入輸出庫,包含? printf
、scanf
、fgets
、fputs
?等函數。<stdlib.h> 標準庫函數,包含內存分配、程序控制、轉換函數等,如? malloc
、free
、exit
、atoi
、rand
?等。<string.h> 字符串操作函數,如? strlen
、strcpy
、strcat
、strcmp
?等。<math.h> 數學函數庫,包含各種數學運算函數,如? sin
、cos
、tan
、exp
、log
、sqrt
?等。<time.h> 時間和日期函數,如? time
、clock
、difftime
、strftime
?等。<ctype.h> 字符處理函數,如? isalpha
、isdigit
、isspace
、toupper
、tolower
?等。<limits.h> 定義各種類型的限制值,如? INT_MAX
、CHAR_MIN
、LONG_MAX
?等。<float.h> 定義浮點類型的限制值,如? FLT_MAX
、DBL_MIN
?等。<assert.h> 包含宏? assert
,用于在調試時進行斷言檢查。<errno.h> 定義了錯誤碼變量? errno
?及相關宏,用于表示和處理錯誤。<stddef.h> 定義了一些通用類型和宏,如? size_t
、ptrdiff_t
、NULL
?等。<signal.h> 定義了處理信號的函數和宏,如? signal
、raise
?等。<setjmp.h> 提供非本地跳轉功能的宏和函數,如? setjmp
、longjmp
?等。<locale.h> 定義了與地域化相關的函數和宏,如? setlocale
、localeconv
?等。<stdarg.h> 提供處理可變參數函數的宏,如? va_start
、va_arg
、va_end
?等。<stdbool.h> 定義布爾類型和值? true
?和?false
。<stdint.h> 定義了精確寬度的整數類型,如? int8_t
、uint16_t
?等。<inttypes.h> 提供與整數類型相關的格式化輸出宏和函數。 <complex.h> 提供復數運算的函數和宏,如? cabs
、carg
?等。<tgmath.h> 為泛型數學函數提供宏,以簡化對不同類型數據的數學運算。 <fenv.h> 提供對浮點環境的控制,如舍入模式和異常狀態。
1. stdio.h
簡介
標準輸入輸出庫
庫宏:
序號 宏 & 描述 1 NULL
這個宏是一個空指針常量的值。2 _IOFBF、_IOLBF?和?_IONBF
這些宏擴展了帶有特定值的整型常量表達式,并適用于?setvbuf?函數的第三個參數。3 BUFSIZ
這個宏是一個整數,該整數代表了?setbuf?函數使用的緩沖區大小。4 EOF
這個宏是一個表示已經到達文件結束的負整數。5 FOPEN_MAX
這個宏是一個整數,該整數代表了系統可以同時打開的文件數量。6 FILENAME_MAX
這個宏是一個整數,該整數代表了字符數組可以存儲的文件名的最大長度。如果實現沒有任何限制,則該值應為推薦的最大值。7 L_tmpnam
這個宏是一個整數,該整數代表了字符數組可以存儲的由 tmpnam 函數創建的臨時文件名的最大長度。8 SEEK_CUR、SEEK_END?和?SEEK_SET
這些宏是在?fseek?函數中使用,用于在一個文件中定位不同的位置。9 TMP_MAX
這個宏是 tmpnam 函數可生成的獨特文件名的最大數量。10 stderr、stdin?和?stdout
這些宏是指向 FILE 類型的指針,分別對應于標準錯誤、標準輸入和標準輸出流。
?函數列表:
1 int fclose(FILE *stream)
關閉流 stream。刷新所有的緩沖區。2 void clearerr(FILE *stream)
清除給定流 stream 的文件結束和錯誤標識符。3 int feof(FILE *stream)
測試給定流 stream 的文件結束標識符。4 int ferror(FILE *stream)
測試給定流 stream 的錯誤標識符。5 int fflush(FILE *stream)
刷新流 stream 的輸出緩沖區。6 int fgetpos(FILE *stream, fpos_t *pos)
獲取流 stream 的當前文件位置,并把它寫入到 pos。7 FILE *fopen(const char *filename, const char *mode)
使用給定的模式 mode 打開 filename 所指向的文件。8 size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)
從給定流 stream 讀取數據到 ptr 所指向的數組中。9 FILE *freopen(const char *filename, const char *mode, FILE *stream)
把一個新的文件名 filename 與給定的打開的流 stream 關聯,同時關閉流中的舊文件。10 int fseek(FILE *stream, long int offset, int whence)
設置流 stream 的文件位置為給定的偏移 offset,參數?offset?意味著從給定的?whence?位置查找的字節數。11 int fsetpos(FILE *stream, const fpos_t *pos)
設置給定流 stream 的文件位置為給定的位置。參數?pos?是由函數 fgetpos 給定的位置。12 long int ftell(FILE *stream)
返回給定流 stream 的當前文件位置。13 size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)
把 ptr 所指向的數組中的數據寫入到給定流 stream 中。14 int remove(const char *filename)
刪除給定的文件名 filename,以便它不再被訪問。15 int rename(const char *old_filename, const char *new_filename)
把 old_filename 所指向的文件名改為 new_filename。16 void rewind(FILE *stream)
設置文件位置為給定流 stream 的文件的開頭。17 void setbuf(FILE *stream, char *buffer)
定義流 stream 應如何緩沖。18 int setvbuf(FILE *stream, char *buffer, int mode, size_t size)
另一個定義流 stream 應如何緩沖的函數。19 FILE *tmpfile(void)
以二進制更新模式(wb+)創建臨時文件。20 char *tmpnam(char *str)
生成并返回一個有效的臨時文件名,該文件名之前是不存在的。21 int fprintf(FILE *stream, const char *format, ...)
發送格式化輸出到流 stream 中。22 int printf(const char *format, ...)
發送格式化輸出到標準輸出 stdout。23 int sprintf(char *str, const char *format, ...)
發送格式化輸出到字符串。24 int vfprintf(FILE *stream, const char *format, va_list arg)
使用參數列表發送格式化輸出到流 stream 中。25 int vprintf(const char *format, va_list arg)
使用參數列表發送格式化輸出到標準輸出 stdout。26 int vsprintf(char *str, const char *format, va_list arg)
使用參數列表發送格式化輸出到字符串。27 int fscanf(FILE *stream, const char *format, ...)
從流 stream 讀取格式化輸入。28 int scanf(const char *format, ...)
從標準輸入 stdin 讀取格式化輸入。29 int sscanf(const char *str, const char *format, ...)
從字符串讀取格式化輸入。30 int fgetc(FILE *stream)
從指定的流 stream 獲取下一個字符(一個無符號字符),并把位置標識符往前移動。31 char *fgets(char *str, int n, FILE *stream)
從指定的流 stream 讀取一行,并把它存儲在 str 所指向的字符串內。當讀取?(n-1)?個字符時,或者讀取到換行符時,或者到達文件末尾時,它會停止,具體視情況而定。32 int fputc(int char, FILE *stream)
把參數 char 指定的字符(一個無符號字符)寫入到指定的流 stream 中,并把位置標識符往前移動。33 int fputs(const char *str, FILE *stream)
把字符串寫入到指定的流 stream 中,但不包括空字符。34 int getc(FILE *stream)
從指定的流 stream 獲取下一個字符(一個無符號字符),并把位置標識符往前移動。35 int getchar(void)
從標準輸入 stdin 獲取一個字符(一個無符號字符)。36 char *gets(char *str)
從標準輸入 stdin 讀取一行,并把它存儲在 str 所指向的字符串中。當讀取到換行符時,或者到達文件末尾時,它會停止,具體視情況而定。37 int putc(int char, FILE *stream)
把參數 char 指定的字符(一個無符號字符)寫入到指定的流 stream 中,并把位置標識符往前移動。38 int putchar(int char)
把參數 char 指定的字符(一個無符號字符)寫入到標準輸出 stdout 中。39 int puts(const char *str)
把一個字符串寫入到標準輸出 stdout,直到空字符,但不包括空字符。換行符會被追加到輸出中。40 int ungetc(int char, FILE *stream)
把字符 char(一個無符號字符)推入到指定的流 stream 中,以便它是下一個被讀取到的字符。41 void perror(const char *str)
把一個描述性錯誤消息輸出到標準錯誤 stderr。首先輸出字符串 str,后跟一個冒號,然后是一個空格。42 int snprintf(char *str, size_t size, const char *format, ...)
格式字符串到 str 中。
?示例:
#include <stdio.h>
#include <string.h>/*
string .h 頭文件定義了一個變量類型、一個宏和各種操作字符數組的函數。
<string.h> 是 C 標準庫中的一個頭文件,提供了一組用于處理字符串和內存塊的函數。
這些函數涵蓋了字符串復制、連接、比較、搜索和內存操作等。
*/int main(int argc, char const *argv[])
{/*void *memchr(const void *str, int c, size_t n)在參數 str 所指向的字符串的前 n 個字節中搜索第一次出現字符 c(一個無符號字符)的位置。*/char str1[10] = "poiuyoor";char *cp1 = (char *)memchr(str1, 'o', 8);puts(cp1);/*int memcmp(const void *str1, const void *str2, size_t n)把 str1 和 str2 的前 n 個字節進行比較。返回值如果返回值 < 0,則表示 str1 小于 str2。如果返回值 > 0,則表示 str1 大于 str2。如果返回值 = 0,則表示 str1 等于 str2。*/char str2[10] = "poiuyppp";if (!memcmp(str1, str2, 5)){printf("前5個字符一樣....\n");}/*void *memset(void *str, int c, size_t n)將指定的值 c 復制到 str 所指向的內存區域的前 n 個字節中。*/cp1=(char*)memset(str1,'t',3);puts(cp1);return 0;
}
2. string.h
簡介
string .h?頭文件定義了一個變量類型、一個宏和各種操作字符數組的函數。
<string.h>
?是 C 標準庫中的一個頭文件,提供了一組用于處理字符串和內存塊的函數。這些函數涵蓋了字符串復制、連接、比較、搜索和內存操作等。
?函數列表:
序號 函數 & 描述 1 void *memchr(const void *str, int c, size_t n)
在參數?str?所指向的字符串的前 n 個字節中搜索第一次出現字符 c(一個無符號字符)的位置。2 int memcmp(const void *str1, const void *str2, size_t n)
把?str1?和?str2?的前 n 個字節進行比較。3 void *memcpy(void *dest, const void *src, size_t n)
從 src 復制 n 個字符到?dest。4 void *memmove(void *dest, const void *src, size_t n)
另一個用于從?src?復制 n 個字符到?dest?的函數。5 void *memset(void *str, int c, size_t n)
將指定的值 c 復制到 str 所指向的內存區域的前 n 個字節中。6 char *strcat(char *dest, const char *src)
把?src?所指向的字符串追加到?dest?所指向的字符串的結尾。7 char *strncat(char *dest, const char *src, size_t n)
把?src?所指向的字符串追加到?dest?所指向的字符串的結尾,直到 n 字符長度為止。8 char *strchr(const char *str, int c)
在參數?str?所指向的字符串中搜索第一次出現字符 c(一個無符號字符)的位置。9 int strcmp(const char *str1, const char *str2)
把?str1?所指向的字符串和?str2?所指向的字符串進行比較。10 int strncmp(const char *str1, const char *str2, size_t n)
把?str1?和?str2?進行比較,最多比較前 n 個字節。11 int strcoll(const char *str1, const char *str2)
把?str1?和?str2?進行比較,結果取決于 LC_COLLATE 的位置設置。12 char *strcpy(char *dest, const char *src)
把?src?所指向的字符串復制到?dest。13 char *strncpy(char *dest, const char *src, size_t n)
把?src?所指向的字符串復制到?dest,最多復制 n 個字符。14 size_t strcspn(const char *str1, const char *str2)
檢索字符串 str1 開頭連續有幾個字符都不含字符串 str2 中的字符。15 char *strerror(int errnum)
從內部數組中搜索錯誤號 errnum,并返回一個指向錯誤消息字符串的指針。16 size_t strlen(const char *str)
計算字符串 str 的長度,直到空結束字符,但不包括空結束字符。17 char *strpbrk(const char *str1, const char *str2)
檢索字符串?str1?中第一個匹配字符串?str2?中字符的字符,不包含空結束字符。也就是說,依次檢驗字符串 str1 中的字符,當被檢驗字符在字符串 str2 中也包含時,則停止檢驗,并返回該字符位置。18 char *strrchr(const char *str, int c)
在參數?str?所指向的字符串中搜索最后一次出現字符 c(一個無符號字符)的位置。19 size_t strspn(const char *str1, const char *str2)
檢索字符串?str1?中第一個不在字符串?str2?中出現的字符下標。20 char *strstr(const char *haystack, const char *needle)
在字符串?haystack?中查找第一次出現字符串?needle(不包含空結束字符)的位置。21 char *strtok(char *str, const char *delim)
分解字符串?str?為一組字符串,delim?為分隔符。22 size_t strxfrm(char *dest, const char *src, size_t n)
根據程序當前的區域選項中的 LC_COLLATE 來轉換字符串?src?的前?n?個字符,并把它們放置在字符串?dest?中。
示例:
#include <stdio.h>
#include <string.h>/*
string .h 頭文件定義了一個變量類型、一個宏和各種操作字符數組的函數。
<string.h> 是 C 標準庫中的一個頭文件,提供了一組用于處理字符串和內存塊的函數。
這些函數涵蓋了字符串復制、連接、比較、搜索和內存操作等。
*/int main(int argc, char const *argv[])
{/*void *memchr(const void *str, int c, size_t n)在參數 str 所指向的字符串的前 n 個字節中搜索第一次出現字符 c(一個無符號字符)的位置。*/char str1[10] = "poiuyoor";char *cp1 = (char *)memchr(str1, 'o', 8);puts(cp1);/*int memcmp(const void *str1, const void *str2, size_t n)把 str1 和 str2 的前 n 個字節進行比較。返回值如果返回值 < 0,則表示 str1 小于 str2。如果返回值 > 0,則表示 str1 大于 str2。如果返回值 = 0,則表示 str1 等于 str2。*/char str2[10] = "poiuyppp";if (!memcmp(str1, str2, 5)){printf("前5個字符一樣....\n");}/*void *memset(void *str, int c, size_t n)將指定的值 c 復制到 str 所指向的內存區域的前 n 個字節中。*/cp1=(char*)memset(str1,'t',3);puts(cp1);return 0;
}
3. math.h
簡介
math.h?頭文件定義了各種數學函數和一個宏。在這個庫中所有可用的功能都帶有一個?double?類型的參數,且都返回?double?類型的結果。
<math.h>
?是 C 標準庫中的一個頭文件,包含了大量用于數學運算的函數和宏。這些函數和宏提供了基本的算術運算、三角函數、指數函數、對數函數、冪函數、舍入函數等。
函數列表:
序號 函數 & 描述 1 double acos(double x)
返回以弧度表示的 x 的反余弦。2 double asin(double x)
返回以弧度表示的 x 的反正弦。3 double atan(double x)
返回以弧度表示的 x 的反正切。4 double atan2(double y, double x)
返回以弧度表示的 y/x 的反正切。y 和 x 的值的符號決定了正確的象限。5 double cos(double x)
返回弧度角 x 的余弦。6 double cosh(double x)
返回 x 的雙曲余弦。7 double sin(double x)
返回弧度角 x 的正弦。8 double sinh(double x)
返回 x 的雙曲正弦。9 double tanh(double x)
返回 x 的雙曲正切。10 double exp(double x)
返回 e 的 x 次冪的值。11 double frexp(double x, int *exponent)
把浮點數 x 分解成尾數和指數。返回值是尾數,并將指數存入 exponent 中。所得的值是 x = mantissa * 2 ^ exponent。12 double ldexp(double x, int exponent)
返回 x 乘以 2 的 exponent 次冪。13 double log(double x)
返回 x 的自然對數(基數為 e 的對數)。14 double log10(double x)
返回 x 的常用對數(基數為 10 的對數)。15 double modf(double x, double *integer)
返回值為小數部分(小數點后的部分),并設置 integer 為整數部分。16 double pow(double x, double y)
返回 x 的 y 次冪。17 double sqrt(double x)
返回 x 的平方根。18 double ceil(double x)
返回大于或等于 x 的最小的整數值。19 double fabs(double x)
返回 x 的絕對值。20 double floor(double x)
返回小于或等于 x 的最大的整數值。21 double fmod(double x, double y)
返回 x 除以 y 的余數。
常用數學常量:?
常量 值 描述 M_PI
3.14159265358979323846 圓周率 π M_E
2.71828182845904523536 自然對數的底數 e M_LOG2E
1.44269504088896340736 log2(e) M_LOG10E
0.43429448190325182765 log10(e) M_LN2
0.69314718055994530942 ln(2) M_LN10
2.30258509299404568402 ln(10) M_PI_2
1.57079632679489661923 π/2 M_PI_4
0.78539816339744830962 π/4 M_1_PI
0.31830988618379067154 1/π M_2_PI
0.63661977236758134308 2/π M_2_SQRTPI
1.12837916709551257390 2/√π M_SQRT2
1.41421356237309504880 √2 M_SQRT1_2
0.70710678118654752440 1/√2
示例:?
#include <stdio.h>
#include <math.h>/*
math.h 頭文件定義了各種數學函數和一個宏。在這個庫中所有可用的功能都帶有一個 double 類型的參數,且都返回 double 類型的結果。
<math.h> 是 C 標準庫中的一個頭文件,包含了大量用于數學運算的函數和宏。
這些函數和宏提供了基本的算術運算、三角函數、指數函數、對數函數、冪函數、舍入函數等。
*/int main(int argc, char const *argv[])
{double x=9.0;double y=2.0;double num=-3.7;//計算平方根double res=sqrt(x);printf("平方根:sqrt(%.2f)=%.2f \n",x,res);//冪運算res=pow(x,y);printf("冪運算:pow(%.2f,%.2f)=%.2f \n",x,y,res);//向上取整res=ceil(num);printf("向上取整:ceil(%.2f)=%.2f \n",num,res);//向下取整res=floor(num);printf("向下取整:floor(%.2f)=%.2f \n",num,res);//四舍五入res=round(num);printf("四舍五入:round(%.2f)=%.2f \n",num,res);//絕對值res=fabs(num);printf("絕對值:fabs(%.2f)=%.2f \n",num,res);return 0;
}
4. time.h
簡介:
time.h?頭文件定義了四個變量類型、兩個宏和各種操作日期和時間的函數。
<time.h>
?是 C 標準庫中的一個頭文件,提供了處理和操作日期和時間的函數和類型。這個頭文件中的函數用于獲取當前時間、設置時間、格式化時間和計算時間差等。
函數列表:
序號 函數 & 描述 1 char *asctime(const struct tm *timeptr)
返回一個指向字符串的指針,它代表了結構 timeptr 的日期和時間。2 clock_t clock(void)
返回程序執行起(一般為程序的開頭),處理器時鐘所使用的時間。3 char *ctime(const time_t *timer)
返回一個表示當地時間的字符串,當地時間是基于參數 timer。4 double difftime(time_t time1, time_t time2)
返回 time1 和 time2 之間相差的秒數 (time1-time2)。5 struct tm *gmtime(const time_t *timer)
timer 的值被分解為 tm 結構,并用協調世界時(UTC)也被稱為格林尼治標準時間(GMT)表示。6 struct tm *localtime(const time_t *timer)
timer 的值被分解為 tm 結構,并用本地時區表示。7 time_t mktime(struct tm *timeptr)
把 timeptr 所指向的結構轉換為一個依據本地時區的 time_t 值。8 size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)
根據 format 中定義的格式化規則,格式化結構 timeptr 表示的時間,并把它存儲在 str 中。9 time_t time(time_t *timer)
計算當前日歷時間,并把它編碼成 time_t 格式。10 int timespec_get(struct timespec *ts, int base);
獲取當前時間(C11)。
示例:
#include <stdio.h>
#include <time.h>/*
time.h 頭文件定義了四個變量類型、兩個宏和各種操作日期和時間的函數。<time.h> 是 C 標準庫中的一個頭文件,提供了處理和操作日期和時間的函數和類型。
這個頭文件中的函數用于獲取當前時間、設置時間、格式化時間和計算時間差等。
*/int main(int argc, char const *argv[])
{/*time_t time(time_t *timer)計算當前日歷時間,并把它編碼成 time_t 格式。*/time_t current_time; // 聲明time(¤t_time); // 賦值/*char *ctime(const time_t *timer)返回一個表示當地時間的字符串,當地時間是基于參數 timer。*/printf("當前時間:\n");printf("%s", ctime(¤t_time)); // 轉換時間為字符串,當前時區(東八區)// 3.格式化時間/*tm 結構的定義如下:struct tm {int tm_sec; // 秒,范圍從 0 到 59int tm_min; //分,范圍從 0 到 59int tm_hour; //小時,范圍從 0 到 23int tm_mday; //一月中的第幾天,范圍從 1 到 31int tm_mon; ///月,范圍從 0 到 11int tm_year; //自 1900 年起的年數int tm_wday; //一周中的第幾天,范圍從 0 到 6int tm_yday; //一年中的第幾天,范圍從 0 到 365int tm_isdst; //夏令時};*/struct tm *time_info;char time_str[100]; // 聲明/*struct tm *localtime(const time_t *timer)timer 的值被分解為 tm 結構,并用本地時區表示。*/time_info = localtime(¤t_time);/*size_t strftime(char *str, size_t maxsize, const char *format, const struct tm *timeptr)根據 format 中定義的格式化規則,格式化結構 timeptr 表示的時間,并把它存儲在 str 中。*/strftime(time_str, sizeof(time_str), "中國時間:%Y-%m-%d %H:%M:%S\n", time_info);puts(time_str);//延遲3秒printf("等待3秒...\n");struct timespec delay={3,0};/*int nanosleep(const struct timespec *req,struct timespec *rem);休眠指定的時間*/nanosleep(&delay,NULL);//更新時間time(¤t_time);//賦值當前時間printf("更新后的時間:%s", ctime(¤t_time));return 0;
}
5. stdlib.h
簡介:
stdlib .h?頭文件定義了四個變量類型、一些宏和各種通用工具函數。
<stdlib.h>
?是 C 標準庫中的一個頭文件,提供了許多通用工具函數,包括內存分配、進程控制、排序和搜索、以及字符串轉換等。
庫宏 :
序號 宏 & 描述 1 NULL
這個宏是一個空指針常量的值。2 EXIT_FAILURE
這是 exit 函數失敗時要返回的值。3 EXIT_SUCCESS
這是 exit 函數成功時要返回的值。4 RAND_MAX
這個宏是 rand 函數返回的最大值。5 MB_CUR_MAX
這個宏表示在多字節字符集中的最大字符數,不能大于 MB_LEN_MAX。
函數列表:
序號 函數 & 描述 1 double atof(const char *str)
把參數?str?所指向的字符串轉換為一個浮點數(類型為 double 型)。2 int atoi(const char *str)
把參數?str?所指向的字符串轉換為一個整數(類型為 int 型)。3 long int atol(const char *str)
把參數?str?所指向的字符串轉換為一個長整數(類型為 long int 型)。4 double strtod(const char *str, char **endptr)
把參數?str?所指向的字符串轉換為一個浮點數(類型為 double 型)。5 long int strtol(const char *str, char **endptr, int base)
把參數?str?所指向的字符串轉換為一個長整數(類型為 long int 型)。6 unsigned long int strtoul(const char *str, char **endptr, int base)
把參數?str?所指向的字符串轉換為一個無符號長整數(類型為 unsigned long int 型)。7 void *calloc(size_t nitems, size_t size)
分配所需的內存空間,并返回一個指向它的指針。8 void free(void *ptr)
釋放之前調用?calloc、malloc?或?realloc?所分配的內存空間。9 void *malloc(size_t size)
分配所需的內存空間,并返回一個指向它的指針。10 void *realloc(void *ptr, size_t size)
嘗試重新調整之前調用?malloc?或?calloc?所分配的 ptr 所指向的內存塊的大小。11 void abort(void)
使一個異常程序終止。12 int atexit(void (*func)(void))
當程序正常終止時,調用指定的函數?func。13 void exit(int status)
使程序正常終止。14 char *getenv(const char *name)
搜索 name 所指向的環境字符串,并返回相關的值給字符串。15 int system(const char *string)
由 string 指定的命令傳給要被命令處理器執行的主機環境。16 void *bsearch(const void *key, const void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *))
執行二分查找。17 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
數組排序。18 int abs(int x)
返回 x 的絕對值。19 div_t div(int numer, int denom)
分子除以分母。20 long int labs(long int x)
返回 x 的絕對值。21 ldiv_t ldiv(long int numer, long int denom)
分子除以分母。22 int rand(void)
返回一個范圍在 0 到?RAND_MAX?之間的偽隨機數。23 void srand(unsigned int seed)
該函數播種由函數?rand?使用的隨機數發生器。24 int mblen(const char *str, size_t n)
返回參數?str?所指向的多字節字符的長度。25 size_t mbstowcs(schar_t *pwcs, const char *str, size_t n)
把參數?str?所指向的多字節字符的字符串轉換為參數?pwcs?所指向的數組。26 int mbtowc(wchar_t *pwc, const char *str, size_t n)
檢查參數?str?所指向的多字節字符。27 size_t wcstombs(char *str, const wchar_t *pwcs, size_t n)
把數組?pwcs?中存儲的編碼轉換為多字節字符,并把它們存儲在字符串?str?中。28 int wctomb(char *str, wchar_t wchar)
檢查對應于參數?wchar?所給出的多字節字符的編碼。
示例:
#include <stdio.h> //IO操作
#include <stdlib.h> //系統工具
#include <time.h> //時間/*
stdlib .h 頭文件定義了四個變量類型、一些宏和各種通用工具函數。
<stdlib.h> 是 C 標準庫中的一個頭文件,
提供了許多通用工具函數,包括內存分配、進程控制、排序和搜索、以及字符串轉換等。
*/int compare_int(const void *a, const void *b);int main(int argc, char const *argv[])
{// 動態內存分配/*void *calloc(size_t nitems, size_t size)分配所需的內存空間,并返回一個指向它的指針。void free(void *ptr)釋放之前調用 calloc、malloc 或 realloc 所分配的內存空間。void *malloc(size_t size)分配所需的內存空間,并返回一個指向它的指針。void *realloc(void *ptr, size_t size)嘗試重新調整之前調用 malloc 或 calloc 所分配的 ptr 所指向的內存塊的大小。*//*1 double atof(const char *str)把參數 str 所指向的字符串轉換為一個浮點數(類型為 double 型)。2 int atoi(const char *str)把參數 str 所指向的字符串轉換為一個整數(類型為 int 型)。3 long int atol(const char *str)把參數 str 所指向的字符串轉換為一個長整數(類型為 long int 型)。4 double strtod(const char *str, char **endptr)把參數 str 所指向的字符串轉換為一個浮點數(類型為 double 型)。5 long int strtol(const char *str, char **endptr, int base)把參數 str 所指向的字符串轉換為一個長整數(類型為 long int 型)。*/char str1[] = "1234";char str2[] = "1000abcd";int num1;long num2;// 使用atoi轉換為int類型num1 = atoi(str1);printf("atoi: %d\n", num1);// 使用strtol 轉換為long類型num2 = strtol(str2, NULL, 10);printf("strtol: %ld\n", num2);// 3.生成隨機數/*22 int rand(void)返回一個范圍在 0 到 RAND_MAX 之間的偽隨機數。23 void srand(unsigned int seed)該函數播種由函數 rand 使用的隨機數發生器。*/int i2;// 設置隨機數種子srand(time(NULL));// 生成5隨機數for (i2 = 0; i2 < 5; i2++){printf("%d ", rand() % 100); // 生成0~99之間的隨機數}printf("\n");// 4.數學函數/*18 int abs(int x)返回 x 的絕對值。long int labs(long int x)返回 x 的絕對值。*/int x = -10;long y = -10000000000L;printf("abc(%d)=%d \n", x, abs(x));printf("labc(%ld)=%ld \n", y, labs(y));// 5.執行系統命令system/*15 int system(const char *string)由 string 指定的命令傳給要被命令處理器執行的主機環境。*/printf("執行系統命令system ls:\n");system("ls");//在linux上執行ls 查看文件和目錄/*6.13 void exit(int status)使程序正常終止。*/printf("1 異常結束,0 正常結束\n");//exit(EXIT_SUCCESS);//printf("---------------------------------\n");/*16 void *bsearch(const void *key, const void *base, size_t nitems, size_t size, int (*compar)(const void *, const void *))執行二分查找。17 void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))數組排序。*/int arr[]={42,85,19,75,66,67};int length=sizeof(arr)/sizeof(arr[0]);int key=750;int *item;//使用qsort排序qsort(arr,length,sizeof(int),compare_int);printf("排序后的數組:\n");for (int i = 0; i < length; i++){printf("%d ",arr[i]);}printf("\n");//bsearch搜索,沒找到返回NULL指針item=(int*)bsearch(&key,arr,length,sizeof(int),compare_int);if (item!=NULL){printf("*item=%d \n",*item);}else{//NULL代表falseprintf("item=%p \n",item);}return 0;
}int compare_int(const void * a, const void* b){return *(int*)a-*(int*)b;
}
6. ctype.h
簡介:
C 標準庫的?ctype.h?頭文件提供了一些函數,可用于測試和轉換字符,這些函數主要用于檢查字符的類型(如字母、數字、空白字符等)以及進行字符大小寫轉換。
庫宏:
函數列表:
序號 函數 & 描述 1 int isalnum(int c)
該函數檢查所傳的字符是否是字母和數字。2 int isalpha(int c)
該函數檢查所傳的字符是否是字母。3 int iscntrl(int c)
該函數檢查所傳的字符是否是控制字符。4 int isdigit(int c)
該函數檢查所傳的字符是否是十進制數字。5 int isgraph(int c)
該函數檢查所傳的字符是否有圖形表示法。6 int islower(int c)
該函數檢查所傳的字符是否是小寫字母。7 int isprint(int c)
該函數檢查所傳的字符是否是可打印的。8 int ispunct(int c)
該函數檢查所傳的字符是否是標點符號字符。9 int isspace(int c)
該函數檢查所傳的字符是否是空白字符。10 int isupper(int c)
該函數檢查所傳的字符是否是大寫字母。11 int isxdigit(int c)
該函數檢查所傳的字符是否是十六進制數字。序號 函數 & 描述轉換函數 1 int tolower(int c)
該函數把大寫字母轉換為小寫字母。2 int toupper(int c)
該函數把小寫字母轉換為大寫字母。
示例:
#include <stdio.h>
#include <ctype.h> //試和轉換字符 的頭文件/*
C 標準庫的 ctype.h 頭文件提供了一些函數,可用于測試和轉換字符,
這些函數主要用于檢查字符的類型(如字母、數字、空白字符等)以及進行字符大小寫轉換。
<ctype.h> 提供了一組方便的函數,用于處理字符的分類和轉換操作,是 C 標準庫中處理字符操作的重要工具。
*/int main(int argc, char const *argv[])
{char ch = 'A';/*2 int isalpha(int c)該函數檢查所傳的字符是否是字母。*/if (isalpha(ch)){printf("%c\n", ch);}else{printf("我不是字母...\n");}/*4 int isdigit(int c)該函數檢查所傳的字符是否是十進制數字。 字符串的數字*/char ch2 = '5';if (isdigit(ch2)){printf("%c\n", ch2);}else{printf("我不是數字...\n");}/*1 int tolower(int c)該函數把大寫字母轉換為小寫字母。2 int toupper(int c)該函數把小寫字母轉換為大寫字母。*/ch2='H';printf("%c\n",tolower(ch2));ch2='i';printf("%c\n",toupper(ch2));return 0;
}
7. errno.h
簡介:
C 標準庫的?errno.h?頭文件定義了整數變量?errno,它是通過系統調用設置的,在錯誤事件中的某些庫函數表明了什么發生了錯誤。該宏擴展為類型為 int 的可更改的左值,因此它可以被一個程序讀取和修改。
<errno.h>
?是 C 標準庫中的一個頭文件,提供了一種在程序中報告和處理錯誤的機制。這個頭文件定義了宏和變量,用于指示和描述運行時錯誤的類型。errno.h?頭文件定義了一系列表示不同錯誤代碼的宏,這些宏應擴展為類型為?int?的整數常量表達式。
errno
?是一個全局變量,用于存儲最近發生的錯誤代碼。這個變量的類型為?int
。當一個庫函數發生錯誤時,它通常會設置?errno
?以指示錯誤類型。例如,在文件操作中,如果?
fopen
?函數因為文件不存在而失敗,它會將?errno
?設置為?ENOENT
。常用錯誤碼
以下是一些常見的錯誤碼,它們在?
<errno.h>
?中定義為宏:
EPERM
:操作不允許ENOENT
:沒有這樣的文件或目錄ESRCH
:沒有這樣的進程EINTR
:中斷的系統調用EIO
:輸入/輸出錯誤ENXIO
:沒有這樣的設備或地址E2BIG
:參數列表太長ENOMEM
:內存不足EACCES
:權限被拒絕EFAULT
:壞的地址EBUSY
:資源忙EEXIST
:文件已存在EXDEV
:跨設備鏈接ENODEV
:沒有這樣的設備ENOTDIR
:不是一個目錄EISDIR
:是一個目錄EINVAL
:無效的參數ENFILE
:系統文件表溢出EMFILE
:打開的文件過多ENOTTY
:不是終端設備ETXTBSY
:文本文件忙EFBIG
:文件過大ENOSPC
:設備上沒有空間ESPIPE
:非法的尋址EROFS
:只讀文件系統EMLINK
:鏈接過多EPIPE
:管道破裂注意事項
- 線程安全:在多線程程序中,
errno
?通常實現為線程局部存儲(Thread-Local Storage, TLS),以確保每個線程有獨立的錯誤碼。- 初始值:在成功調用的情況下,庫函數通常不會修改?
errno
?的值。因此在檢查錯誤之前,應確保?errno
?被設置為 0。- 錯誤碼范圍:不同的操作系統和 C 標準庫實現可能會定義額外的錯誤碼。程序應避免依賴特定錯誤碼的數值。
錯誤處理建議
- 檢查返回值:在調用可能失敗的函數時,總是檢查其返回值。
- 設定?
errno
?為 0:在調用一個函數前,可以將?errno
?設定為 0,以便在調用后檢查?errno
?是否被修改。- 使用?
strerror
:通過?strerror
?將?errno
?轉換為可讀的字符串,便于調試和日志記錄。總之,
<errno.h>
?提供了一種標準化的方式來報告和處理程序中的錯誤,使得錯誤處理代碼更為一致和可維護。
宏列表:
序號 宏 & 描述 1 extern int errno
這是通過系統調用設置的宏,在錯誤事件中的某些庫函數表明了什么發生了錯誤。2 EDOM Domain Error
這個宏表示一個域錯誤,它在輸入參數超出數學函數定義的域時發生,errno 被設置為 EDOM。3 ERANGE Range Error
這個宏表示一個范圍錯誤,它在輸入參數超出數學函數定義的范圍時發生,errno 被設置為 ERANGE。
示例:
#include <stdio.h>#include <assert.h> //斷言
#include <errno.h> //錯誤處理/*
C 標準庫的 assert.h頭文件提供了一個名為 assert 的宏,它可用于驗證程序做出的假設,并在假設為假時輸出診斷消息。
assert.h 標準庫主要用于在程序運行時進行斷言斷言是一種用于測試假設的手段,通常用于調試階段,以便在程序出現不符合預期的狀態時立即發現問題。
<assert.h> 提供的斷言機制是 C 語言中一個有用的工具,幫助開發人員在早期發現和修復程序中的錯誤。
已定義的宏 assert 指向另一個宏 NDEBUG,宏 NDEBUG 不是 <assert.h> 的一部分。
如果已在引用 <assert.h> 的源文件中定義 NDEBUG 為宏名稱,則 assert 宏的定義如下:assert(expression)
assert 宏用于測試表達式 expression 是否為真。如果 expression 為假(即結果為 0),assert 會輸出一條錯誤信息并終止程序的執行。
這個錯誤信息包括以下內容:觸發斷言失敗的表達式
源文件名
行號
在發布版本中,可以通過定義 NDEBUG 來禁用所有的 assert 斷言。assertde行為是:
符合條件(表達式為真):程序繼續正常執行;
不符合條件(表達式為假):程序立即終止,并輸出一條錯誤信息,包括失敗的表達式、文件名和行號。重要注意事項:
調試節點使用:assert 通常在開發和調試階段使用,用于不活程序中邏輯錯誤,它可以驗證程序的假設是否成立。生產環境:再生產環境中,一般禁用assert。可以通過定義 NDEBUG 宏來禁用所有斷言;#define NDEBUG#inclue <assert.h>
代替方案:在生產代碼中,通常使用更健壯的錯誤處理機制,例如 if語句和errno。C 標準庫的 errno.h 頭文件定義了整數變量 errno,它是通過系統調用設置的,在錯誤事件中的某些庫函數表明了什么發生了錯誤。
該宏擴展為類型為 int 的可更改的左值,因此它可以被一個程序讀取和修改。
<errno.h> 是 C 標準庫中的一個頭文件,提供了一種在程序中報告和處理錯誤的機制。
這個頭文件定義了宏和變量,用于指示和描述運行時錯誤的類型。errno.h 頭文件定義了一系列表示不同錯誤代碼的宏,這些宏應擴展為類型為 int 的整數常量表達式。
errno 是一個全局變量,用于存儲最近發生的錯誤代碼。這個變量的類型為 int。
當一個庫函數發生錯誤時,它通常會設置 errno 以指示錯誤類型。例如,在文件操作中,如果 fopen 函數因為文件不存在而失敗,它會將 errno 設置為 ENOENT。*/int main(int argc, char const *argv[])
{ //1.入門 斷言int x=10;int y=0;//斷言assert符合條件繼續執行assert(x==10);printf("x是10,程序正常繼續執行......\n");//斷言assert 不符合條件,程序終止并輸出錯誤信息//assert(y!=0);//printf("y!=0......程序終止并輸出錯誤信息\n");//2.進階 斷言FILE *file;//打開文件file=fopen("不存在的文件.txt","r");if (file==NULL){//文件大失敗,檢查 errnoperror("打開文件失敗"); }else{printf("打開文件成功...\n");fclose(file);}//斷言文件不存在assert(errno==ENOENT);//ENOENT (2): 文件或目錄不存在。//符合條件(斷言表達式為真):件程序繼續正常執行printf("符合條件(斷言表達式為真):件程序繼續正常執行 \n");return 0;
}
8. signal.h
簡介:
<signal.h>
?是 C 標準庫中的一個頭文件,用于處理信號。signal.h?頭文件定義了一個變量類型?sig_atomic_t、兩個函數調用和一些宏來處理程序執行期間報告的不同信號。
信號是一種異步通知機制,允許進程在特定事件發生時執行預定義的處理函數。
下面是一個簡單的示例程序,演示如何使用 signal 函數來捕捉 SIGINT 信號(通常由 Ctrl+C 產生)。
函數列表:
常量 描述 SIGABRT
由? abort
?函數產生的信號,表示異常終止SIGALRM
由? alarm
?函數設定的定時器到期信號SIGBUS
非法內存訪問(例如,訪問未對齊的內存地址) SIGCHLD
子進程狀態改變(退出或停止) SIGCONT
繼續執行被暫停的進程 SIGFPE
算術錯誤(例如,除零錯誤、浮點異常) SIGHUP
掛起信號(通常用于檢測終端斷開) SIGILL
非法指令 SIGINT
中斷信號(通常由 Ctrl+C 產生) SIGKILL
立即終止信號(不能被捕捉或忽略) SIGPIPE
向無讀進程的管道寫數據 SIGQUIT
終端退出信號(通常由 Ctrl+\ 產生),生成核心轉儲 SIGSEGV
段錯誤(非法內存訪問) SIGSTOP
停止進程的執行(不能被捕捉或忽略) SIGTERM
終止信號 SIGTSTP
暫停進程(通常由 Ctrl+Z 產生) SIGTTIN
后臺進程從終端讀數據時產生的信號 SIGTTOU
后臺進程向終端寫數據時產生的信號 SIGUSR1
用戶自定義信號 1 SIGUSR2
用戶自定義信號 2 SIGPOLL
I/O 事件(取代 SIGIO) SIGPROF
定時器到期信號(由? setitimer
?設置的 profiling timer)SIGSYS
非法系統調用 SIGTRAP
斷點或陷阱指令 SIGURG
套接字緊急條件信號 SIGVTALRM
虛擬時鐘定時器到期信號 SIGXCPU
超過 CPU 時間限制 SIGXFSZ
超過文件大小限制