1、memset
函數原型:void *memset(void *s, int ch, size_t n);
函數解釋:將s中前n個字節 (typedef unsigned int size_t )用 ch 替換並返回 s 。
void* memset(void* s, int ch, size_t count) { assert(s!=NULL); char* p = (char*)s; while (count--) { *p++ = ch; } return s; }
2、memcpy
函數原型:void *memcpy(void *dest, const void *src, size_t n);
功能:從源src所指的內存地址的起始位置開始拷貝n個字節到目標dest所指的內存地址的起始位置中
void* memcpy(void* p1,const void* p2, size_t count) { assert(p1 != NULL || p2 != NULL); char* dst = (char*)p1; char* src = (char*)p2; while (count--) { *dst++ = *src++; } return p1; }
3、memove
函數原型:void *memmove( void* dest, const void* src, size_t count );
功能:memmove用於從src拷貝count個字符到dest,如果目標區域和源區域有重疊的話,memmove能夠保證源串在被覆蓋之前將重疊區域的字節拷貝到目標區域中。但複製後src內容會被更改。但是當目標區域與源區域沒有重疊則和memcpy函數功能相同
void* memove(void* p1, const char* p2, size_t count) { assert(p1 == NULL || p2 == NULL); char* dst = (char*)p1; const char* src = (const char*)p2; if ((dst > src) && (dst < src + count)) { //while (count--) //{ // *dst = *src; // dst++; // src++; //}//以上寫法是錯誤的 dst = dst + count - 1; src - src + count - 1; while (count--) { *dst = *src; dst--; src--; } } else { while (count--) { *dst = *src; dst++; src++; } } return dst; }
4、memcmp
原型:int memcmp(const void *buf1, const void *buf2, unsigned int count);
功能:比較內存區域buf1和buf2的前count個字節。
說明:當buf1<buf2時,返回值<0
當buf1=buf2時,返回值=0
當buf1>buf2時,返回值>0
int memcmp(const void* p1,const void* p2, size_t count) { assert(p1 != NULL&&p2 != NULL); int ret = 0; const char* src = (const char*)p1; const char* dst = (const char*)p2; if (count == 0) { return 0; } while (--count&&*src == *dst) { src++; dst++; } return (*((unsigned char*)src) - *((unsigned char*)dst)); }
5、strcpy
原型聲明:char *strcpy(char* dest, const char *src);
功能:把從src地址開始且含有NULL結束符的字符串複製到以dest開始的地址空間
說明:src和dest所指內存區域不可以重疊且dest必須有足夠的空間來容納src的字符串。
返回指向dest的指針。
char* strcpy(char* dst, const char* src) { assert(dst != NULL&&src != NULL); char* start = dst; while ((*dst++ = *src++) != '\0'); return start; }
6、strncpy
函數原型char*strncpy(char*dest,char*src,size_tn);
功能:(c/c++)複製字符串src中的內容(字符,數字、漢字....)到字符串dest中,複製多少由size_tn的值決定。
1)src串長度<=dest串長度,(這裏的串長度包含串尾NULL字符)
如果n>src由於長度達到src NULL,正常複製,特別注意,如果src中有NULL,strncpy複製到NULL即使沒到n也提前停止。如果n = src串長度,與strcpy一致。注意n的選擇當n > dest串長度,dest棧空間溢出產生崩潰異常。
2)src串長度>dest串長度
如果n =dest串長度,則dest串沒有NULL字符,會導致輸出會有亂碼。如果不考慮src串複製完整性,可以將dest 最後一字符置爲NULL。
char* strncpy(char* dst, const char* src, size_t count)
{
assert(dst != NULL&&src != NULL);
char* start = dst;
while (count && (*dst++ = *src++) != '\0')
{
count--;
}
if (count)
{
while (count--)
{
*dst++ = '\0';
}
}
return start;
}
7、strcat
函數原型extern char *strcat(char *dest,char *src);
功能:把src所指字符串添加到dest結尾處(覆蓋dest結尾處的'\0')。
說明:src和dest所指內存區域不可以重疊且dest必須有足夠的空間來容納src的字符串。
返回指向dest的指針。
char* strcat(char* dst, const char* src) { assert(dst != NULL || src != NULL); char* start = dst; while (*dst) { dst++; } while (*dst++ = *src++) ; return start; }
8、strncat
函數原型:char * strncat(char *dest, const char *src, size_t n);
【參數說明】:dest指向目標字符串,src爲指向源字符串。
功能:把src所指字符串的前n個字符添加到dest所指字符串的結尾處,並覆蓋dest所指字符串結尾的'/0',從而實現字符串的連接。
說明:src和dest所指內存區域不可以重疊,並且dest必須有足夠的空間來容納src的字符串。
返回值:返回指向dest的指針。
char* strncat(char* dst, const char* src, size_t count) { assert(dst != NULL && src != NULL); char* start = dst; while (*dst++) ; dst--; while (count--) { if (!(*dst++ = *src++)) return start; } *dst = '\0'; return start; }
9、strcmp
函數原型:extern int strcmp(const char *s1,const char *s2);
說明:
當s1<s2時,返回爲負數;
當s1=s2時,返回值= 0;
當s1>s2時,返回正數。
即:兩個字符串自左向右逐個字符相比(按ASCII值大小相比較),直到出現不同的字符或遇'\0'爲止
int strcmp(const char* src, const char* dst) { assert(dst != NULL&&src != NULL); int ret = 0; while (!(ret = *(unsigned char*)src - *(unsigned char*)dst) && *dst) { ++src; ++dst; } if (ret < 0) { ret = -1; } else if (ret>0) { ret = 1; } return ret; }
10、strncmp
函數原型:int strncmp ( const char * str1, const char * str2, size_t num );
功能:strncmp函數是指定比較size個字符。也就是說,如果字符串s1與s2的前size個字符相同,函數返回值爲0。此函數功能即比較字符串str1和str2的前maxlen個字符。如果前maxlen字節完全相等,返回值就=0;在前maxlen字節比較過程中,如果出現str1[n]與str2[n]不等,則依次比較str1和str2的前n位,設i(i<n)爲兩字符串首次的不同位,則返回(str1[i]-str2[i]
int strncmp(const char* dst, const char* src, size_t count) { assert(dst != NULL || src != NULL); if (count==0) { return 0; } while (--count&&*dst&&*dst == *src) { dst++; src++; } return (*(unsigned char*)dst - *(unsigned char*)src); }
11、strchr
函數原型:extern char *strchr(const char *s,char c);
功能:查找字符串s中首次出現字符c的位置
說明:返回首次出現c的位置的指針,返回的地址是被查找字符串指針開始的第一個與Val相同字符的指針,如果s中不存在c則返回NULL。
返回值:成功則返回要查找字符第一次出現的位置,失敗返回NULL
char* strchr(const char* str, int ch) { assert(str!=NULL); while (*str&&*str != (char)ch) { str++; } if (*str == ch) return (char*)str; return NULL; }
12、strlen
函數原型:extern unsigned int strlen(char *s);
功能:計算給定字符串的(unsigned int型)長度,不包括'\0'在內
說明:返回s的長度,不包括結束符NULL。
int strlen(const char* str) { assert(str != NULL); int count; while (*str) { count++; str++; } return count; }
int strlen(const char* str) { assert(str != NULL); const char* p = str; while (*p++) { p++; } return (int)(p - str - 1); }
int strlen(const char* str) { assert(str != NULL); if (*str == '\0') { return 0; } else { return strlen(str++) + 1; } }
13、
char* strstr(const char* str1, const char* str2) { assert(str1 != NULL&&str2 != NULL); const char* p = str1; const char* s1 = p; const char* s2 = NULL; while (*p) { s1 = p; s2 = str2; while (*s1&&*s2&&*s1 == *s2) { s1++; s2++; } if (*s2 == '\0') { return (char*)p; } p++; } return NULL; }