字符串函数的简单介绍

     

目录

函数介绍及模拟实现

 1.strlen

2.strcpy

3.strcat

4.strcmp

5.strstr

6.memcpy

7.memmove


   本篇文章会对常用的字符函数进行简单的介绍,也会进行一系列的模拟实现。

函数介绍及模拟实现

 1.strlen

        size_t strlen ( const char * str );

        这个字符串是用来测定字符串的长度,以字符‘\0’为结束标志,返回值是‘\0’前的字符个数。

要注意的是返回值是无符号的(易错)。

模拟实现:

int my_strlen(const char * str)
{
 int count = 0;
 while(*str)
 {
 count++;
 str++;
 }
 return count;
}

2.strcpy

        char* strcpy(char * destination, const char * source );

        这个函数的作用是将源字符串的内容复制到目标字符串。要保证源字符串以‘\0’结束。

目标空间的大小也要足够充足且可变。

模拟实现:

char *my_strcpy(char *dest, const char*src)
{ 
 char *ret = dest;
 assert(dest != NULL);
 assert(src != NULL);
 
 while((*dest++ = *src++))
 {
 ;
 }
 return ret;
}

3.strcat

        char * strcat ( char * destination, const char * source );

这个函数的作用是将源字符串接到目标字符串后面。源字符串必须以 '\0' 结束。 目标空间必须有足够的大,能容纳下源字符串的内容。

模拟实现:
 

char *my_strcat(char *dest, const char*src)
{
 char *ret = dest;
 assert(dest != NULL);
 assert(src != NULL);
 while(*dest)
 {
 dest++;
 }
 while((*dest++ = *src++))
 {
 ;
 }
 return ret;
}

4.strcmp

int strcmp ( const char * str1, const char * str2 );

        这个函数是比较两个字符串的大小。标准规定: 第一个字符串大于第二个字符串,则返回大于0的数字; 第一个字符串等于第二个字符串,则返回0; 第一个字符串小于第二个字符串,则返回小于0的数字。

举个例子有字符串“abcde”和“abccd”,如果这两个字符串进行比较则从第一个字符开始,相同的话会比较下一位,直到第四位d与c进行比较,因为d的ASCII码值较大所以第一个字符串较大,strcmp函数则会返回大于0的数。(注意这个字符串比较与长度无关,仅对每一位进行比较得出结果。)

模拟实现:
 

int my_strcmp (const char * src, const char * dst)
{
        int ret = 0 ;
 assert(src != NULL);
   assert(dest != NULL);
        while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
                ++src, ++dst;
        if ( ret < 0 )
                ret = -1 ;
        else if ( ret > 0 )
                ret = 1 ;
        return( ret );
}

5.strstr

char * strstr ( const char *str1, const char * str2);

        这个函数的功能是查找字符串。例如:有两个字符串str1=“www.csdn.com”和str2=“csdn”则strstr会返回字符串“csdn.com”。就是在一个字符串中找到另一个字符串并且将该字符串及后面所有内容返回。

模拟实现:

char *  strstr (const char * str1, const char * str2)
{
        char *cp = (char *) str1;
        char *s1, *s2;
        if ( !*str2 )
            return((char *)str1);
        while (*cp)
       {
                s1 = cp;
                s2 = (char *) str2;
                while ( *s1 && *s2 && !(*s1-*s2) )
                        s1++, s2++;
                if (!*s2)
                        return(cp);
                cp++;
       }
        return(NULL);

6.memcpy

void * memcpy ( void * destination, const void * source, size_t num );

        函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。 这个函数在遇到 '\0' 的时候并不会停下来。在使用时一般会把形参强转成char*类型便于使用。

模拟实现:
 

void * memcpy ( void * dst, const void * src, size_t count)
{
        void * ret = dst;
 assert(dst);
   assert(src);
        /*
         * copy from lower addresses to higher addresses
         */
        while (count--) {
                *(char *)dst = *(char *)src;
                dst = (char *)dst + 1;
                src = (char *)src + 1;
       }
        return(ret);
}

7.memmove

void * memmove ( void * destination, const void * source, size_t num );

        和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的。 如果源空间和目标空间出现重叠,就得使用memmove函数处理。

模拟实现:

void * memmove ( void * dst, const void * src, size_t count)
{
        void * ret = dst;
        if (dst <= src || (char *)dst >= ((char *)src + count)) {
         while (count--) {
                        *(char *)dst = *(char *)src;
                        dst = (char *)dst + 1;
                        src = (char *)src + 1;
               }
       }
        else {
                
                dst = (char *)dst + count - 1;
                src = (char *)src + count - 1;
                while (count--) {
                        *(char *)dst = *(char *)src;
                        dst = (char *)dst - 1;
                        src = (char *)src - 1;
               }
       }
        return(ret);
}

这里要解释的是当dst<src时是从前往后复制,dst>=src+count(要复制字节个数)时从前往后复制或者从后往前复制都可以。在src<dst<src+count时是从后往前复制。所以也可以更简便的认为dst<src时是前→后,dst>=src时是后→前,所以有另一种写法:

void* my_memmove(void* arr2, void* arr1, size_t a)
{

	void* ret = arr2;
	if (arr2 < arr1)
	{
		while (a--)
		{
			*(char*)arr2 = *(char*)arr1;
			arr2 = (char*)arr2 + 1;
			arr1 = (char*)arr1 + 1;

		}
	}
	else
	{
		while (a--)
		{
			*((char*)arr2 + a) = *((char*)arr1 + a);
		}
	}
	return ret;
}

        到此本文内容结束,如有错误和疏漏,望小伙伴们多加指正。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值