(1)strlen函数
函数原型:size_t strlen(const char *s);
功能:计算给定字符串的(unsigned int型)长度,不包括'\0'在内,如果给定的的字符串没赋初值,它会从字符串首地址一直计算,直到遇到'\0'停止。
代码实现:
-
#include <stdio.h> -
int my_strlen(const char *s) -
{ -
const char *p = s; -
while(*p != '\0') -
{ -
p++; -
} -
return p - s; -
} -
int main() -
{ -
char a[20] = "Hello,World"; -
int len = my_strlen(a); -
printf("%d\n",len); -
return 0; -
}
(2)strcmp函数
函数原型: int strcmp(const char *s1, const char *s2);
功能:比较两个字符串,设这两个字符串为str1,str2,若str1==str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数。
代码实现:
-
#include <stdio.h> -
int my_strcmp(const char *s1, const char *s2) -
{ -
int ret = 0; -
if(NULL == s1 || NULL == s2 ) -
{ -
return; -
} -
while(*s1 && *s2 && (*s1 == *s2)) -
{ -
s1++; -
s2++; -
} -
ret = *s1 - *s2; -
if(ret > 0) -
{ -
return 1; -
} -
if(ret == 0) -
{ -
return 0; -
} -
if(ret < 0) -
{ -
return -1; -
} -
} -
int main() -
{ -
char a[10] = "Hello"; -
char b[10] = "Wrold"; -
int date = 0; -
date = my_strcmp(a,b); -
printf("%d\n",date); -
return 0; -
}
(3)strcat函数
函数原型: char *strcat(char *dest, const char *src);
功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0'),即字符串拼接。
代码实现:
-
#include <stdio.h> -
char *my_strcat(char *dest, const char *src) -
{ -
char *temp = dest; -
if(NULL == src) -
{ -
return dest; -
} -
while(*dest != '\0') -
{ -
dest++; -
} -
while((*dest++ = *src++) != '\0') -
{ -
; -
} -
dest = '\0'; -
return temp; -
} -
int main() -
{ -
char a[20] = {"Hello"}; -
char b[10] = {"World"}; -
my_strcat(a,b); -
printf("%s\n",a); -
return 0; -
}
(4)strncat()函数
函数原型: char *strncat(char *dest, const char *src, size_t n);
功能:字符串拼接,同上!(前n个字符)。
代码实现:
-
#include <stdio.h> -
#include <assert.h> -
char *my_strncat(char *dest, const char *src,size_t n) -
{ -
char *ret = dest; -
assert(NULL != dest && NULL != src); //前置条件断言:代码执行之前必须具备的特性 -
while(*dest != '\0') -
{ -
dest++; -
} -
while(n &&((*dest++ = *src++) != '\0')) -
{ -
n--; -
} -
dest = '\0'; -
return ret; -
} -
int main() -
{ -
char a[20] = {"Hello"}; -
char b[20] = {"World"}; -
my_strncat(a,b,4); -
printf("%s\n",a); -
return 0; -
}
(5)strcpy函数
函数原型: char *strcpy(char *dest, const char *src);
功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
代码实现:
-
#include <stdio.h> -
#include <assert.h> -
char *my_strcpy(char *dest ,const char *src) -
{ -
char *ret = dest; -
assert(NULL != dest); //断言宏:前置条件断言:代码执行之前必须具备的特性,在<assert.h>头文件中 -
assert(NULL != src); -
while((*dest++ = *src++) != '\0'); -
return ret; -
} -
int main() -
{ -
char a[20] = {0}; -
char b[20] = {"Hello,World!"}; -
my_strcpy(a,b); -
printf("%s\n",a); -
return 0; -
}
(6)strncpy函数
函数原型: char *strncpy(char *dest, const char *src, size_t n);
功能:字符串拷贝操作,同上(前 n 个字符)。
代码实现:
-
#include <stdio.h> -
#include <assert.h> -
char *my_strncpy(char *dest, const char *src, size_t n) -
{ -
char *ret = dest; -
assert(NULL != dest && NULL != src) ; //前置条件断言:代码执行之前必须具备的特性 -
while(n && ((*dest++ = *src++ ) != '\0')) -
{ -
n--; -
} -
dest = '\0'; -
return ret; -
} -
int main() -
{ -
char a[20] = {0}; -
char b[20] = {"Hello,World!"}; -
my_strncpy(a,b,8); -
printf("%s\n",a); -
return 0; -
}
(7)strchr函数
函数原型:char *strchr (const char * s, int c);
功能:查找字符串s中首次出现字符c的位置,str 为目标字符串 c 为要查找的字符。
代码实现:
-
#include <stdio.h> -
char *my_strchr(const char *s,int c) -
{ -
if(NULL == s) -
{ -
return NULL; -
} -
while('\0' != *s) -
{ -
if(*s - c == 0) -
{ -
return (char *)s; -
} -
s++; -
} -
return NULL; -
} -
int main() -
{ -
char *a = "Hello,World!"; -
char *ret; -
ret = my_strchr(a,'e'); -
printf("%s\n",ret); -
return 0; -
}
(8)strtok函数
函数原型: char *strtok(char *str, const char *delim);
功能:分解字符串为一组字符串。str为要分解的字符,delim为分隔符字符(如果传入字符串,则传入的字符串中每个字符均为分割符)。首次调用时,str指向要分解的字符串,之后再次调用要把str设成NULL。
代码实现:
-
#include <stdio.h> -
char *my_strtok(char *str, const char *delim) -
{ -
static char *move = NULL; -
char *save_str; -
const char *p = delim; -
int i = 0, len; -
if(NULL != str) -
{ -
move = str; -
} -
if('\0'== move) -
{ -
save_str = NULL; -
} -
else -
{ -
save_str = move; -
} -
while('\0' != *p) -
{ -
p++; -
} -
len = p - delim; -
while('\0' != *move) -
{ -
for(i = 0;i < len;i++) -
{ -
if(delim[i] == *move) -
{ -
*move = '\0'; -
move++; -
return save_str; -
} -
} -
move++; -
} -
return save_str; -
} -
int main() -
{ -
char a[50] = {"ABCD,1234,!@#$,abcd"}; -
printf("%s\n",my_strtok(a,",")); -
return 0; -
}
(9)memcpy函数
函数原型: void *memcpy(void *dest, const void *src, size_t n);
功能:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中。
代码实现(1):
-
#include <stdio.h> -
void *my_memcpy(void *dest,const void *src,size_t n) -
{ -
char *pd = (char *)dest; -
char *ps = (char *)src; -
while(n--) -
{ -
*pd++ = *ps++; -
} -
return dest; -
} -
int main() -
{ -
char a[20] = {0}; -
char b[20] = "Hello,World!"; -
my_memcpy(a,b,8); -
printf("%s\n",a); -
return 0; -
}
代码实现(2):
-
#include <stdio.h> -
void *my_memcpy(void *dest, const void *src, size_t n) -
{ -
int num_cpu = n / (sizeof(dest)); //按位宽拷贝 -
int num_char = n % (sizeof(dest)); //按字节拷贝 -
unsigned long *pd = (unsigned long *)dest; -
const unsigned long *ps = (unsigned long *)src; -
if((NULL == dest) || (NULL == src)) -
{ -
return NULL; -
} -
while(num_cpu--) -
{ -
*pd++ = *ps++; -
} -
while(num_char--) -
{ -
*((char *)pd++) = *((char *)ps++); -
} -
return dest; -
} -
int main() -
{ -
char a[20] = {0}; -
char b[20] = "Hello,World!"; -
my_memcpy(a,b,8); -
printf("%s\n",a); -
return 0; -
}
注:本系统为32位数;
(10)memmove函数
函数原型:void *memmove(void *dest, const void *src,size_t n);
功能:从src拷贝n个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改,但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
代码实现:
-
#include <stdio.h> -
void *my_memmove(void *dest, const void *src,size_t n) -
{ -
char *pd,*ps; -
if((NULL == dest) || (NULL == src)) -
{ -
return NULL; -
} -
if((char *)dest > (char *)src &&(char *)dest < (char *)src + n ) -
{ -
pd = (char *)dest + n - 1; -
ps = (char *)src + n - 1; -
while(n--) -
{ -
*pd-- = *ps--; -
} -
} -
else -
{ -
pd = (char *)dest; -
ps = (char *)src; -
while(n--) -
{ -
*pd++ = *ps++; -
} -
} -
return dest; -
} -
int main() -
{ -
char a[20] = {0}; -
char b[20] = {"Hello,World!"}; -
my_memmove(a,b,8); -
printf("%s\n",a); -
return 0; -
}
注:相比上个memcpy函数,该函数考虑了内存重叠的情况,概括的讲,内存重叠分为两种情况;
(1)如果是前面的内存要复制到后面的内存,那么每次移动的时候应该倒序复制字节。
(2)如果是后面的内存复制到前面的内存,那么每次移动的时候应该正序复制字节。
(11)memset函数
函数原型: void *memset(void *s, int c, size_t n);
功能:作用是在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种常用方法
注:按字节填充
代码实现:
-
#include <stdio.h> -
void *my_memset(void *s,int c,size_t n) -
{ -
char *ps = (char *)s; -
if((NULL == s) || c < 0) -
{ -
return NULL; -
} -
while(n--) -
{ -
*ps++ = c; -
} -
return s; -
} -
int main() -
{ -
char a[10] = {1,2,3,4,5,6,7,8,9,10}; -
int i; -
for(i = 0;i < 10;i++) -
{ -
printf("a[%d]=%d ",i,a[i]); -
} -
printf("\n"); -
printf("=======================\n"); -
my_memset(a,0,2); -
for(i = 0;i < 10;i++) -
{ -
printf("a[%d]=%d ",i,a[i]); -
} -
printf("\n"); -
return 0; -
}
(12)strstr函数
函数原型: char *strstr(const char *haystack, const char *needle);
功能:函数用于判断字符串needle是否是haystack的子串。如果是,则该函数返回needle在haystack中首次出现的地址;否则,返回NULL。
代码实现:
-
#include <stdio.h> -
char *my_strstr(const char *haystack, const char *needle) -
{ -
const char *ph; -
const char *pn; -
if(NULL == haystack || NULL == needle) -
{ -
return NULL; -
} -
while('\0' != *haystack) -
{ -
ph = haystack; -
pn = needle; -
do{ -
if('\0' == *pn) -
{ -
return (char *)haystack; -
} -
}while(*ph++ == *pn++); -
haystack++; -
} -
return NULL; -
} -
int main() -
{ -
const char *a = "Hello,World!"; -
const char *b = "ll"; -
const char *ret = NULL; -
ret = my_strstr(a,b); -
printf("%s\n",ret); -
return 0; -
}

