一.記憶體操作函數:
(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)
memcpy() 用來複制記憶體,其原型為:
void * memcpy ( void * dest, const void * src, size_t num );
memcpy() 會複制 src 所指的記憶體内容的前 num 個位元組到 dest 所指的記憶體位址上。
memcpy() 并不關心被複制的資料類型,隻是逐位元組地進行複制,這給函數的使用帶來了很大的靈活性,可以面向任何資料類型進行複制。
需要注意的是:
dest 指針要配置設定足夠的空間,也即大于等于 num 位元組的空間。如果沒有配置設定空間,會出現斷錯誤。
【傳回值】傳回指向 dest 的指針。注意傳回的指針類型是 void,使用時一般要進行強制類型轉換。
(3)
定義函數: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)
定義函數: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>
void* malloc (size_t size);
【參數說明】size 為需要配置設定的記憶體空間的大小,以位元組(Byte)計。
【傳回值】配置設定成功傳回指向該記憶體的位址,失敗則傳回 NULL。
由于申請記憶體空間時可能有也可能沒有,是以需要自行判斷是否申請成功,再進行後續操作。
(6)
calloc() 函數用來動态地配置設定記憶體空間并初始化為 0,其原型為:
void* calloc (size_t num, size_t size);
calloc() 在記憶體中動态地配置設定 num 個長度為 size 的連續空間,并将每一個位元組都初始化為 0。是以它的結果是配置設定了 num*size 個位元組長度的記憶體空間,并且每個位元組的值都是0。
(7)
calloc() 函數是給一個已經配置設定了位址的指針重新配置設定空間,參數ptr為原有的空間位址,newsize是重新申請的位址長度。其原型為:
void* realloc(void * ptr, unsigned newsize)
realloc函數将ptr的記憶體大小增加到newsize。
傳回值:配置設定成功傳回指向該記憶體的位址,失敗則傳回 NULL。
(8)
free() 函數用來釋放動态配置設定的記憶體空間,其原型為:
void free (void* ptr);
【參數說明】ptr 為将要釋放的記憶體空間的位址。
free() 隻能釋放動态配置設定的記憶體空間,并不能釋放任意的記憶體。下面的寫法是錯誤的:
如果 ptr 所指向的記憶體空間不是由上面的三個函數所配置設定的,或者已被釋放,那麼調用 free() 會有無法預知的情況發生。
如果 ptr 為 NULL,那麼 free() 不會有任何作用。
注意:free() 不會改變 ptr 變量本身的值,調用 free() 後它仍然會指向相同的記憶體空間,但是此時該記憶體已無效,不能被使用。是以建議将 ptr 的值設定為 NULL,例如:
(9)
定義函數:void * memchr(const void *s, char c, size_t n);
函數說明:memchr()從頭開始搜尋s 所指的記憶體内容前n 個位元組,直到發現第一個值為c 的位元組,則傳回指向該位元組的指針。
傳回值:如果找到指定的位元組則傳回該位元組的指針,否則傳回0。
(10)
memmove() 用來複制記憶體内容,其原型為:
void * memmove(void *dest, const void *src, size_t num);
memmove代碼實作:
<code>void</code> <code>* my_memmove(</code><code>void</code> <code>* dst,</code><code>const</code> <code>void</code> <code>* src,</code><code>int</code> <code>count)</code>
<code>{</code>
<code> </code><code>void</code> <code>* ret = dst;</code>
<code> </code><code>if</code> <code>(dst <= src || (</code><code>char</code> <code>*)dst >= ((</code><code>char</code> <code>*)src + count))</code>
<code> </code><code>{</code>
<code> </code><code>while</code> <code>(count--)</code>
<code> </code><code>{</code>
<code> </code><code>*(</code><code>char</code> <code>*)dst = *(</code><code>char</code> <code>*)src;</code>
<code> </code><code>dst = (</code><code>char</code> <code>*)dst + 1;</code>
<code> </code><code>src = (</code><code>char</code> <code>*)src + 1;</code>
<code> </code><code>}</code>
<code> </code><code>}</code>
<code> </code><code>else</code>
<code> </code><code>dst = (</code><code>char</code> <code>*)dst + count - 1;</code>
<code> </code><code>src = (</code><code>char</code> <code>*)src + count - 1;</code>
<code> </code><code>dst = (</code><code>char</code> <code>*)dst - 1;</code>
<code> </code><code>src = (</code><code>char</code> <code>*)src - 1;</code>
<code> </code><code>}</code>
<code> </code><code>return</code><code>(ret);</code>
<code>}</code>
<code>int</code> <code>main()</code>
<code> </code><code>char</code> <code>a[12];</code>
<code> </code><code>puts</code><code>((</code><code>char</code> <code>*)my_memmove(a,</code><code>"ammana_babi"</code><code>,16));</code>
<code> </code><code>system</code><code>(</code><code>"pause"</code><code>);</code>
<code> </code><code>return</code> <code>0;</code>
(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()用來将某個檔案内容映射到記憶體中,對該記憶體區域的存取即是直接對該檔案内容的讀寫。
錯誤代碼:
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。
二.字元串操作函數:
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()是函數。
定義函數:char *strcpy(char *dest, const char *src);
函數說明:strcpy()會将參數src 字元串拷貝至參數dest 所指的位址。
傳回值:傳回參數dest 的字元串起始位址。
附加說明:如果參數 dest 所指的記憶體空間不夠大,可能會造成緩沖溢出(buffer Overflow)的錯誤情況,在編寫程式時請特别留意,或者用strncpy()來取代。
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 的值。
strcoll() 函數根據環境變量LC_COLLATE來比較字元串,其原型為:
int strcoll( const char * str1, const char * str2 );
【參數說明】str1、str2 是要進行比較的兩個字元串。
函數說明:strcoll() 會依環境變量 LC_COLLATE 所指定的文字排列次序來比較 s1 和 s2 字元串。
對于設定了 LC_COLLATE 語言環境的情況下,則根據 LC_COLLATE 設定的語言排序方式進行比較。例如,漢字會根據拼音進行比較。
【傳回值】若字元串 str1 和 str2 相同則傳回0。若 str1 大于 str2 則傳回大于 0 的值,否則傳回小于 0 的值。
strcat() 函數用來連接配接字元串,其原型為:
char *strcat(char *dest, const char *src);
【參數】dest 為目的字元串指針,src 為源字元串指針。
strcat() 會将參數 src 字元串複制到參數 dest 所指的字元串尾部;dest 最後的結束字元 NULL 會被覆寫掉,并在連接配接後的字元串的尾部再增加一個 NULL。
注意:dest 與 src 所指的記憶體空間不能重疊,且 dest 要有足夠的空間來容納要複制的字元串。
【傳回值】傳回dest 字元串起始位址。
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。
頭檔案:#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'。
strstr()函數用來檢索子串在字元串中首次出現的位置,其原型為:
char *strstr( char *str, char * substr );
【參數說明】str為要檢索的字元串,substr為要檢索的子串。
【傳回值】傳回字元串str中第一次出現子串substr的位址;如果沒有檢索到子串,則傳回NULL。
strchr() 用來查找某字元在字元串中首次出現的位置,其原型為:
char * strchr (const char *str, int c);
【參數】str 為要查找的字元串,c 為要查找的字元。
strchr() 将會找出 str 字元串中第一次出現的字元 c 的位址,然後将該位址傳回。
注意:字元串 str 的結束标志 NUL 也會被納入檢索範圍,是以 str 的組後一個字元也可以被定位。
【傳回值】如果找到指定的字元則傳回該字元所在位址,否則傳回 NULL。
傳回的位址是字元串在記憶體中随機配置設定的位址再加上你所搜尋的字元在字元串位置。設字元在字元串中首次出現的位置為 i,那麼傳回的位址可以了解為 str + i。
(10)
strrchr() 函數用于查找某字元在字元串中最後一次出現的位置,其原型為:
char * strrchr(const char *str, int c);
strrchr() 将會找出 str 字元串中最後一次出現的字元 c 的位址,然後将該位址傳回。
【傳回值】如果找到就傳回該字元最後一次出現的位置,否則傳回 NULL。
定義函數:char * strtok(char *s, const char *delim);
函數說明:strtok()用來将字元串分割成一個個片段。參數s 指向欲分割的字元串,參數delim 則為分割字元串,當strtok()在參數s 的字元串中發現到參數delim 的分割字元時則會将該字元改為\0 字元。在第一次調用時,strtok()必需給予參數s 字元串,往後的調用則将參數s 設定成NULL。每次調用成功則傳回下一個分割後的字元串指針。
傳回值:傳回下一個分割後的字元串指針,如果已無從分割則傳回NULL。
定義函數:char * strdup(const char *s);
函數說明:strdup()會先用maolloc()配置與參數s 字元串相同的空間大小,然後将參數s 字元串的内容複制到該記憶體位址,然後把該位址傳回。該位址最後可以利用free()來釋放。
傳回值:傳回一字元串指針,該指針指向複制後的新字元串位址。若傳回NULL 表示記憶體不足。
頭檔案:#include <ctype.h>
定義函數:int toupper(int c);
函數說明:若參數 c 為小寫字母則将該對應的大寫字母傳回。
傳回值:傳回轉換後的大寫字母,若不須轉換則将參數c 值傳回。
(14)
定義函數:int tolower(int c);
函數說明:若參數 c 為大寫字母則将該對應的小寫字母傳回。
傳回值:傳回轉換後的小寫字母,若不須轉換則将參數c 值傳回。
(15)
定義函數:int toascii(int c);
函數說明:toascii()會将參數c 轉換成7 位的unsigned char 值,第八位則會被清除,此字元即會被轉成ASCII碼字元。
傳回值:将轉換成功的ASCII 碼字元值傳回。
(16)
atol() 函數的名字源于“ascii to long”,用來将字元串轉換成長整型數(long),其原型為:
long atol(const char * str);
【傳回值】傳回轉換後的長整型數(long);如果 str 不能轉換成 long 或者 str 為空字元串,那麼将傳回 0。
(17)
atoi() 函數用來将字元串轉換成整數(int),其原型為:
int atoi (const char * str);
【傳回值】傳回轉換後的整型數;如果 str 不能轉換成 int 或者 str 為空字元串,那麼将傳回 0。
(18)
函數 atof() 用于将字元串轉換為雙精度浮點數(double),其原型為:
double atof (const char* str);
【傳回值】傳回轉換後的浮點數;如果字元串 str 不能被轉換為 double,那麼傳回 0.0 。
三.檔案操作函數:
四.數學函數:
頭檔案:#include <math.h>
sqrt() 用來求給定值的平方根,其原型為:
double sqrt(double x);
【參數】x 為要計算平方根的值。
如果 x < 0,将會導緻 domain error 錯誤,并把全局變量 errno 的值為設定為 EDOM。
【傳回值】傳回 x 平方根。
注意,使用 GCC 編譯時請加入-lm。
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。
定義函數:int abs (int j);
函數說明:abs()用來計算參數j 的絕對值,然後将結果傳回。
傳回值:傳回參數j 的絕對值結果。
log() 函數傳回以 e 為底的對數值,其原型為:
double log (double x);
log()用來計算以e為底的 x 的對數值,然後将結果傳回。設傳回值為 ret,則
x = eret
如果 x 為負數或 0,則會發生錯誤并設定 errno 值。錯誤代碼:
EDOM:參數x 為負數;
ERANGE:參數x 為零值,零的對數值無定義。
注意:使用 GCC 編譯時請加入-lm。
log10() 傳回以10為底的對數值,其原型為:
double log10(double x);
log10()用來計算以10為底的 x 的對數值,然後将結果傳回。設傳回值為 ret,則
x = 10ret
傳回值:傳回參數x 以10 為底的對數值。
本文轉自 ye小灰灰 51CTO部落格,原文連結:http://blog.51cto.com/10704527/1767367,如需轉載請自行聯系原作者