您好,登錄后才能下訂單哦!
一.內存操作函數:
(1)
頭文件:#include <string.h>
memset() 函數用來將指定內存的前n個字節設置為特定的值,其原型為:
void * memset( void * ptr, int value, size_t num );
參數說明:
ptr 為要操作的內存的指針。
value 為要設置的值。你既可以向 value 傳遞 int 類型的值,也可以傳遞 char 類型的值,int 和 char 可以根據 ASCII 碼相互轉換。
num 為 ptr 的前 num 個字節,size_t 就是unsigned int。
【函數說明】memset() 會將 ptr 所指的內存區域的前 num 個字節的值都設置為 value,然后返回指向 ptr 的指針。
【返回值】返回指向 ptr 的指針。
(2)
頭文件:#include <string.h>
memcpy() 用來復制內存,其原型為:
void * memcpy ( void * dest, const void * src, size_t num );
memcpy() 會復制 src 所指的內存內容的前 num 個字節到 dest 所指的內存地址上。
memcpy() 并不關心被復制的數據類型,只是逐字節地進行復制,這給函數的使用帶來了很大的靈活性,可以面向任何數據類型進行復制。
需要注意的是:
dest 指針要分配足夠的空間,也即大于等于 num 字節的空間。如果沒有分配空間,會出現斷錯誤。
dest 和 src 所指的內存空間不能重疊(如果發生了重疊,使用 memmove() 會更加安全)。
與 strcpy() 不同的是,memcpy() 會完整的復制 num 個字節,不會因為遇到“\0”而結束。
【返回值】返回指向 dest 的指針。注意返回的指針類型是 void,使用時一般要進行強制類型轉換。
(3)
頭文件:#include <string.h>
定義函數:int memcmp (const void *s1, const void *s2, size_t n);
函數說明:memcmp()用來比較s1 和s2 所指的內存區間前n 個字符。
字符串大小的比較是以ASCII 碼表上的順序來決定,次順序亦為字符的值。memcmp()首先將s1 第一個字符值減去s2 第一個字符的值,若差為0 則再繼續比較下個字符,若差值不為0 則將差值返回。例如,字符串"Ac"和"ba"比較則會返回字符'A'(65)和'b'(98)的差值(-33)。
返回值:若參數s1 和s2 所指的內存內容都完全相同則返回0 值。s1 若大于s2 則返回大于0 的值。s1 若小于s2 則返回小于0 的值。
(4)
頭文件:#include <string.h>
定義函數:void * memccpy(void *dest, const void * src, int c, size_t n);
函數說明:memccpy()用來拷貝src 所指的內存內容前n 個字節到dest 所指的地址上。與memcpy()不同的是,memccpy()會在復制時檢查參數c 是否出現,若是則返回dest 中值為c 的下一個字節地址。
返回值:返回指向dest 中值為c 的下一個字節指針。返回值為0 表示在src 所指內存前n 個字節中沒有值為c的字節。
(5)
頭文件:#include <stdlib.h>
malloc() 函數用來動態地分配內存空間(如果你不了解動態內存分配,請查看:C語言動態內存分配及變量存儲類別),其原型為:
void* malloc (size_t size);
【參數說明】size 為需要分配的內存空間的大小,以字節(Byte)計。
【函數說明】malloc() 在堆區分配一塊指定大小的內存空間,用來存放數據。這塊內存空間在函數執行完成后不會被初始化,它們的值是未知的。如果希望在分配內存的同時進行初始化,請使用 calloc() 函數。
【返回值】分配成功返回指向該內存的地址,失敗則返回 NULL。
由于申請內存空間時可能有也可能沒有,所以需要自行判斷是否申請成功,再進行后續操作。
(6)
頭文件:#include <stdlib.h>
calloc() 函數用來動態地分配內存空間并初始化為 0,其原型為:
void* calloc (size_t num, size_t size);
calloc() 在內存中動態地分配 num 個長度為 size 的連續空間,并將每一個字節都初始化為 0。所以它的結果是分配了 num*size 個字節長度的內存空間,并且每個字節的值都是0。
【返回值】分配成功返回指向該內存的地址,失敗則返回 NULL。
(7)
頭文件:#include <stdlib.h>
calloc() 函數是給一個已經分配了地址的指針重新分配空間,參數ptr為原有的空間地址,newsize是重新申請的地址長度。其原型為:
void* realloc(void * ptr, unsigned newsize)
realloc函數將ptr的內存大小增加到newsize。
返回值:分配成功返回指向該內存的地址,失敗則返回 NULL。
(8)
頭文件:#include <stdlib.h>
free() 函數用來釋放動態分配的內存空間,其原型為:
void free (void* ptr);
free() 可以釋放由 malloc()、calloc()、realloc() 分配的內存空間,以便其他程序再次使用。
【參數說明】ptr 為將要釋放的內存空間的地址。
free() 只能釋放動態分配的內存空間,并不能釋放任意的內存。下面的寫法是錯誤的:
int a[10];// ...free(a);
如果 ptr 所指向的內存空間不是由上面的三個函數所分配的,或者已被釋放,那么調用 free() 會有無法預知的情況發生。
如果 ptr 為 NULL,那么 free() 不會有任何作用。
注意:free() 不會改變 ptr 變量本身的值,調用 free() 后它仍然會指向相同的內存空間,但是此時該內存已無效,不能被使用。所以建議將 ptr 的值設置為 NULL,例如:
free(ptr);ptr = NULL;
(9)
頭文件:#include <string.h>
定義函數:void * memchr(const void *s, char c, size_t n);
函數說明:memchr()從頭開始搜尋s 所指的內存內容前n 個字節,直到發現第一個值為c 的字節,則返回指向該字節的指針。
返回值:如果找到指定的字節則返回該字節的指針,否則返回0。
(10)
頭文件:#include <string.h>
memmove() 用來復制內存內容,其原型為:
void * memmove(void *dest, const void *src, size_t num);
memmove() 與 memcpy() 類似都是用來復制 src 所指的內存內容前 num 個字節到 dest 所指的地址上。不同的是,memmove() 更為靈活,當src 和 dest 所指的內存區域重疊時,memmove() 仍然可以正確的處理,不過執行效率上會比使用 memcpy() 略慢些。src和dst所指內存區域如果重疊,復制后src的內容會被更改。
memmove代碼實現:
void * my_memmove(void * dst,const void * src,int count) { void * ret = dst; if (dst <= src || (char *)dst >= ((char *)src + count)) { while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst + 1; src = (char *)src + 1; } } else { dst = (char *)dst + count - 1; src = (char *)src + count - 1; while (count--) { *(char *)dst = *(char *)src; dst = (char *)dst - 1; src = (char *)src - 1; } } return(ret); } int main() { char a[12]; puts((char *)my_memmove(a,"ammana_babi",16)); system("pause"); return 0; }
(11)
頭文件:#include <unistd.h> #include <sys/mman.h>
定義函數:void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offsize);
函數說明:mmap()用來將某個文件內容映射到內存中,對該內存區域的存取即是直接對該文件內容的讀寫。
返回值:若映射成功則返回映射區的內存起始地址,否則返回MAP_FAILED(-1),錯誤原因存于errno 中。
錯誤代碼:
EBADF 參數fd 不是有效的文件描述詞。
EACCES 存取權限有誤。如果是MAP_PRIVATE 情況下文件必須可讀,使用MAP_SHARED 則要有PROT_WRITE 以及該文件要能寫入。
EINVAL 參數start、length 或offset 有一個不合法。
EAGAIN 文件被鎖住,或是有太多內存被鎖住。
ENOMEM 內存不足。
(12)
頭文件:#include <unistd.h> #include <sys/mman.h>
定義函數:int munmap(void *start, size_t length);
函數說明:munmap()用來取消參數start 所指的映射內存起始地址,參數length 則是欲取消的內存大小。當進程結束或利用exec 相關函數來執行其他程序時,映射內存會自動解除,但關閉對應的文件描述詞時不會解除映射。
返回值:如果解除映射成功則返回0,否則返回-1。錯誤原因存于errno 中錯誤代碼EINVAL參數 start 或length 不合法。
(13)
頭文件:#include <unistd.h>
定義函數:size_t getpagesize(void);
函數說明:返回一分頁的大小,單位為字節(byte)。此為系統的分頁大小,不一定會和硬件分頁大小相同。
返回值:內存分頁大小。
附加說明:在 Intel x86 上其返回值應為4096bytes。
二.字符串操作函數:
(1)
頭文件:#include <string.h>
strlen()函數用來計算字符串的長度,其原型為:
unsigned int strlen (char *s);
【參數說明】s為指定的字符串。
strlen()用來計算指定的字符串s 的長度,不包括結束字符"\0"。
【返回值】返回字符串s 的字符數。
注意一下字符數組,例如
char str[100] = "http://see.xidian.edu.cn/cpp/u/biaozhunku/";
定義了一個大小為100的字符數組,但是僅有開始的11個字符被初始化了,剩下的都是0,所以 sizeof(str) 等于100,strlen(str) 等于11。
如果字符的個數等于字符數組的大小,那么strlen()的返回值就無法確定了,例如
char str[6] = "abcxyz";
strlen(str)的返回值將是不確定的。因為str的結尾不是0,strlen()會繼續向后檢索,直到遇到'\0',而這些區域的內容是不確定的。
注意:strlen() 函數計算的是字符串的實際長度,遇到第一個'\0'結束。如果你只定義沒有給它賦初值,這個結果是不定的,它會從首地址一直找下去,直到遇到'\0'停止。而sizeof返回的是變量聲明后所占的內存數,不是實際長度,此外sizeof不是函數,僅僅是一個操作符,strlen()是函數。
(2)
頭文件:#include <string.h>
定義函數:char *strcpy(char *dest, const char *src);
函數說明:strcpy()會將參數src 字符串拷貝至參數dest 所指的地址。
返回值:返回參數dest 的字符串起始地址。
附加說明:如果參數 dest 所指的內存空間不夠大,可能會造成緩沖溢出(buffer Overflow)的錯誤情況,在編寫程序時請特別留意,或者用strncpy()來取代。
(3)
頭文件:#include <string.h>
strcmp() 用來比較字符串(區分大小寫),其原型為:
int strcmp(const char *s1, const char *s2);
【參數】s1, s2 為需要比較的兩個字符串。
字符串大小的比較是以ASCII 碼表上的順序來決定,此順序亦為字符的值。strcmp()首先將s1 第一個字符值減去s2 第一個字符值,若差值為0 則再繼續比較下個字符,若差值不為0 則將差值返回。例如字符串"Ac"和"ba"比較則會返回字符"A"(65)和'b'(98)的差值(-33)。
【返回值】若參數s1 和s2 字符串相同則返回0。s1 若大于s2 則返回大于0 的值。s1 若小于s2 則返回小于0 的值。
注意:strcmp() 以二進制的方式進行比較,不會考慮多字節或寬字節字符;如果考慮到本地化的需求,請使用 strcoll() 函數。
(4)
頭文件:#include <string.h>
strcoll() 函數根據環境變量LC_COLLATE來比較字符串,其原型為:
int strcoll( const char * str1, const char * str2 );
【參數說明】str1、str2 是要進行比較的兩個字符串。
函數說明:strcoll() 會依環境變量 LC_COLLATE 所指定的文字排列次序來比較 s1 和 s2 字符串。
默認情況下,LC_COLLATE 為"POSIX"或"C",strcoll() 和 strcmp() 一樣根據ASCII比較字符串大小。
對于設置了 LC_COLLATE 語言環境的情況下,則根據 LC_COLLATE 設置的語言排序方式進行比較。例如,漢字會根據拼音進行比較。
【返回值】若字符串 str1 和 str2 相同則返回0。若 str1 大于 str2 則返回大于 0 的值,否則返回小于 0 的值。
(5)
頭文件:#include <string.h>
strcat() 函數用來連接字符串,其原型為:
char *strcat(char *dest, const char *src);
【參數】dest 為目的字符串指針,src 為源字符串指針。
strcat() 會將參數 src 字符串復制到參數 dest 所指的字符串尾部;dest 最后的結束字符 NULL 會被覆蓋掉,并在連接后的字符串的尾部再增加一個 NULL。
注意:dest 與 src 所指的內存空間不能重疊,且 dest 要有足夠的空間來容納要復制的字符串。
【返回值】返回dest 字符串起始地址。
(6)
頭文件:#include <string.h>
strncpy()用來復制字符串的前n個字符,其原型為:
char * strncpy(char *dest, const char *src, size_t n);
【參數說明】dest 為目標字符串指針,src 為源字符串指針。
strncpy()會將字符串src前n個字符拷貝到字符串dest。
不像strcpy(),strncpy()不會向dest追加結束標記'\0',這就引發了很多不合常理的問題,將在下面的示例中說明。
注意:src 和 dest 所指的內存區域不能重疊,且 dest 必須有足夠的空間放置n個字符。
【返回值】返回字符串dest。
(7)
頭文件:#inclue <string.h>
strncat()用于將n個字符追加到字符串的結尾,其原型為:
char * strncat(char *dest, const char *src, size_t n);
【參數說明】dest為目標字符串,src為源字符串,n為要追加的字符的數目。
strncat()將會從字符串src的開頭拷貝n 個字符到dest字符串尾部,dest要有足夠的空間來容納要拷貝的字符串。如果n大于字符串src的長度,那么僅將src全部追加到dest的尾部。
strncat()會將dest字符串最后的'\0'覆蓋掉,字符追加完成后,再追加'\0'。
【返回值】返回字符串dest。
(8)
頭文件:#include <string.h>
strstr()函數用來檢索子串在字符串中首次出現的位置,其原型為:
char *strstr( char *str, char * substr );
【參數說明】str為要檢索的字符串,substr為要檢索的子串。
【返回值】返回字符串str中第一次出現子串substr的地址;如果沒有檢索到子串,則返回NULL。
(9)
頭文件:#include <string.h>
strchr() 用來查找某字符在字符串中首次出現的位置,其原型為:
char * strchr (const char *str, int c);
【參數】str 為要查找的字符串,c 為要查找的字符。
strchr() 將會找出 str 字符串中第一次出現的字符 c 的地址,然后將該地址返回。
注意:字符串 str 的結束標志 NUL 也會被納入檢索范圍,所以 str 的組后一個字符也可以被定位。
【返回值】如果找到指定的字符則返回該字符所在地址,否則返回 NULL。
返回的地址是字符串在內存中隨機分配的地址再加上你所搜索的字符在字符串位置。設字符在字符串中首次出現的位置為 i,那么返回的地址可以理解為 str + i。
提示:如果希望查找某字符在字符串中最后一次出現的位置,可以使用 strrchr() 函數。
(10)
頭文件:#include <string.h>
strrchr() 函數用于查找某字符在字符串中最后一次出現的位置,其原型為:
char * strrchr(const char *str, int c);
【參數】str 為要查找的字符串,c 為要查找的字符。
strrchr() 將會找出 str 字符串中最后一次出現的字符 c 的地址,然后將該地址返回。
注意:字符串 str 的結束標志 NUL 也會被納入檢索范圍,所以 str 的組后一個字符也可以被定位。
【返回值】如果找到就返回該字符最后一次出現的位置,否則返回 NULL。
返回的地址是字符串在內存中隨機分配的地址再加上你所搜索的字符在字符串位置。設字符在字符串中首次出現的位置為 i,那么返回的地址可以理解為 str + i。
(11)
頭文件:#include <string.h>
定義函數:char * strtok(char *s, const char *delim);
函數說明:strtok()用來將字符串分割成一個個片段。參數s 指向欲分割的字符串,參數delim 則為分割字符串,當strtok()在參數s 的字符串中發現到參數delim 的分割字符時則會將該字符改為\0 字符。在第一次調用時,strtok()必需給予參數s 字符串,往后的調用則將參數s 設置成NULL。每次調用成功則返回下一個分割后的字符串指針。
返回值:返回下一個分割后的字符串指針,如果已無從分割則返回NULL。
(12)
頭文件:#include <string.h>
定義函數:char * strdup(const char *s);
函數說明:strdup()會先用maolloc()配置與參數s 字符串相同的空間大小,然后將參數s 字符串的內容復制到該內存地址,然后把該地址返回。該地址最后可以利用free()來釋放。
返回值:返回一字符串指針,該指針指向復制后的新字符串地址。若返回NULL 表示內存不足。
(13)
頭文件:#include <ctype.h>
定義函數:int toupper(int c);
函數說明:若參數 c 為小寫字母則將該對應的大寫字母返回。
返回值:返回轉換后的大寫字母,若不須轉換則將參數c 值返回。
(14)
頭文件:#include <stdlib.h>
定義函數:int tolower(int c);
函數說明:若參數 c 為大寫字母則將該對應的小寫字母返回。
返回值:返回轉換后的小寫字母,若不須轉換則將參數c 值返回。
(15)
頭文件:#include <ctype.h>
定義函數:int toascii(int c);
函數說明:toascii()會將參數c 轉換成7 位的unsigned char 值,第八位則會被清除,此字符即會被轉成ASCII碼字符。
返回值:將轉換成功的ASCII 碼字符值返回。
(16)
atol() 函數的名字源于“ascii to long”,用來將字符串轉換成長整型數(long),其原型為:
long atol(const char * str);
【函數說明】atol() 會掃描參數 str 字符串,跳過前面的空白字符(例如空格,tab縮進等,可以通過 isspace() 函數來檢測),直到遇上數字或正負符號才開始做轉換,而再遇到非數字或字符串結束時('\0')才結束轉換,并將結果返回。
【返回值】返回轉換后的長整型數(long);如果 str 不能轉換成 long 或者 str 為空字符串,那么將返回 0。
溫馨提示:ANSI C 規范定義了 stof()、atoi()、atol()、strtod()、strtol()、strtoul() 共6個可以將字符串轉換為數字的函數,大家可以對比學習;使用 atol() 與使用strtol(nptr, NULL, 10) 結果相同。另外在 C99 / C++11 規范中又新增了5個函數,分別是 atoll()、strtof()、strtold()、strtoll()、strtoull()。在此不做介紹,請大家自行學習。
(17)
頭文件:#include <stdlib.h>
atoi() 函數用來將字符串轉換成整數(int),其原型為:
int atoi (const char * str);
【函數說明】atoi() 函數會掃描參數 str 字符串,跳過前面的空白字符(例如空格,tab縮進等,可以通過 isspace()函數來檢測),直到遇上數字或正負符號才開始做轉換,而再遇到非數字或字符串結束時('\0')才結束轉換,并將結果返回。
【返回值】返回轉換后的整型數;如果 str 不能轉換成 int 或者 str 為空字符串,那么將返回 0。
(18)
頭文件:#include <stdlib.h>
函數 atof() 用于將字符串轉換為雙精度浮點數(double),其原型為:
double atof (const char* str);
atof() 的名字來源于 ascii to floating point numbers 的縮寫,它會掃描參數str字符串,跳過前面的空白字符(例如空格,tab縮進等,可以通過 isspace() 函數來檢測),直到遇上數字或正負符號才開始做轉換,而再遇到非數字或字符串結束時('\0')才結束轉換,并將結果返回。參數str 字符串可包含正負號、小數點或E(e)來表示指數部分,如123. 456 或123e-2。
【返回值】返回轉換后的浮點數;如果字符串 str 不能被轉換為 double,那么返回 0.0 。
三.文件操作函數:
詳情可以參考我的另一篇博客:http://10704527.blog.51cto.com/10694527/1763701
四.數學函數:
(1)
頭文件:#include <math.h>
sqrt() 用來求給定值的平方根,其原型為:
double sqrt(double x);
【參數】x 為要計算平方根的值。
如果 x < 0,將會導致 domain error 錯誤,并把全局變量 errno 的值為設置為 EDOM。
【返回值】返回 x 平方根。
注意,使用 GCC 編譯時請加入-lm。
(2)
頭文件:#include <math.h>
pow() 函數用來求 x 的 y 次冪(次方),其原型為:
double pow(double x, double y);
pow()用來計算以x 為底的 y 次方值,然后將結果返回。設返回值為 ret,則 ret = xy。
可能導致錯誤的情況:
如果底數 x 為負數并且指數 y 不是整數,將會導致 domain error 錯誤。
如果底數 x 和指數 y 都是 0,可能會導致 domain error 錯誤,也可能沒有;這跟庫的實現有關。
如果底數 x 是 0,指數 y 是負數,可能會導致 domain error 或 pole error 錯誤,也可能沒有;這跟庫的實現有關。
如果返回值 ret 太大或者太小,將會導致 range error 錯誤。
錯誤代碼:
如果發生 domain error 錯誤,那么全局變量 errno 將被設置為 EDOM;
如果發生 pole error 或 range error 錯誤,那么全局變量 errno 將被設置為 ERANGE。
注意,使用 GCC 編譯時請加入-lm。
(3)
頭文件:#include <stdlib.h>
定義函數:int abs (int j);
函數說明:abs()用來計算參數j 的絕對值,然后將結果返回。
返回值:返回參數j 的絕對值結果。
(4)
頭文件:#include <math.h>
log() 函數返回以 e 為底的對數值,其原型為:
double log (double x);
log()用來計算以e為底的 x 的對數值,然后將結果返回。設返回值為 ret,則
x = eret
如果 x 為負數或 0,則會發生錯誤并設置 errno 值。錯誤代碼:
EDOM:參數x 為負數;
ERANGE:參數x 為零值,零的對數值無定義。
注意:使用 GCC 編譯時請加入-lm。
(5)
頭文件:#include <math.h>
log10() 返回以10為底的對數值,其原型為:
double log10(double x);
log10()用來計算以10為底的 x 的對數值,然后將結果返回。設返回值為 ret,則
x = 10ret
返回值:返回參數x 以10 為底的對數值。
如果 x 為負數或 0,則會發生錯誤并設置 errno 值。錯誤代碼:
EDOM:參數x 為負數;
ERANGE:參數x 為零值,零的對數值無定義。
注意:使用 GCC 編譯時請加入-lm。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。