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