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
当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 当s1=s2时,返回值= 0; 当s1>s2时,返回正数。 即:两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇'\0'为止 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 11、strchr 函数原型:extern char *strchr(const char *s,char c);
功能:查找字符串s中首次出现字符c的位置 说明:返回首次出现c的位置的指针,返回的地址是被查找字符串指针开始的第一个与Val相同字符的指针,如果s中不存在c则返回NULL。 返回值:成功则返回要查找字符第一次出现的位置,失败返回NULL 12、strlen 函数原型:extern unsigned int strlen(char *s); 功能:计算给定字符串的(unsigned int型)长度,不包括'\0'在内 说明:返回s的长度,不包括结束符NULL。 13、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;
}
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);
}
char* strchr(const char* str, int ch)
{
assert(str!=NULL);
while (*str&&*str != (char)ch)
{
str++;
}
if (*str == ch)
return (char*)str;
return 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;
}
}
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;
}