字符串函数总结

来源:互联网 发布:贴片机编程 编辑:程序博客网 时间:2024/05/01 05:53

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){<span style="white-space:pre"></span>assert(dst != NULL&&src != NULL);<span style="white-space:pre"></span>char* start = dst;<span style="white-space:pre"></span>while (count && (*dst++ = *src++) != '\0')<span style="white-space:pre"></span>{<span style="white-space:pre"></span>count--;<span style="white-space:pre"></span>}<span style="white-space:pre"></span>if (count)<span style="white-space:pre"></span>{<span style="white-space:pre"></span>while (count--)<span style="white-space:pre"></span>{<span style="white-space:pre"></span>*dst++ = '\0';<span style="white-space:pre"></span>}<span style="white-space:pre"></span>}<span style="white-space:pre"></span>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。

方法一:

<pre name="code" class="cpp">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、strstr

功能:strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。

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;}






0 0
原创粉丝点击