【c语言】字符串函数的模拟实现(一)

字符串函数模拟实现

strlen介绍及实现

strlen的作用是求字符串长度。因为字符串的结束标志是'\0',所以strlen统计的是'\0'之前出现的字符的个数。另外我们还需要注意的是strlen函数的返回类型是size_t类型,即无符号整形,那我们看一下下面这一段代码:

#include<stdio.h>
#include<string.h>

int main()
{
    
    
     if(strlen("abc") - strlen("abcdef") > 0)
         printf(">\n");
     else
         printf("<=\n");
     return 0;
}

看到这一段代码有人肯定会说3 - 6 < 0屏幕上会打印<=,事实上打印的是>。因为strlen返回的是无符号数,而两个无符号数相减的结果类型也应该是一个size_t类无符号数。所以两数相减的结果-3会被当成一个无符号数,则就大于0了。
在这里插入图片描述

在这里插入图片描述
综上所述,我们在模拟实现strlen函数时,必须注意以下几点:

  1. 要正确获取到字符串长度的话,那么字符串中必须有'\0'
  2. 要注意strlen的返回类型为size_t

方法一:

#include<stdio.h>

size_t my_strlen(const char* str)
{
    
    
     size_t count=0; //计数器,统计字符串长度
     assert(str != NULL);
     while(*str != '\0')
     {
    
    
          count++;
          str++;
     }
     return count;
}
int main()
{
    
    
     char arr1[]="abcdef";
     size_t len=my_strlen(arr1);
     return 0;
}

方法二:
指针 - 指针----->地址 - 地址 :得到的的是指针和指针之间的元素的个数:

#include<stdio.h>

size_t my_strlen(const char* str)
{
    
    
     assert(p != NULL);
     char* cur=str;
     while(*cur != '\0')
     {
    
    
          cur++;
     }
     return cur - str;
}
int main()
{
    
    
     char arr1[]="abcdef";
     size_t len=my_strlen(arr1);
     return 0;
}

方法三:
递归方式(不创建临时变量)

#include<stdio.h>

size_t my_strlen(const char* str)
{
    
    
     if(*str != '\0')
         return 1+my_strlen(str+1);
     else
         return 0;
}
int main()
{
    
    
     char arr1[]="abcdef";
     size_t len=my_strlen(arr1);
     return 0;
}

strcpy介绍及实现

strcpy函数就是将一个字符串拷贝到另一个字符串中的函数,在拷贝字符串时也会将字符串的结束标志'\0'也拷贝进去。这里的destination指的是目标字符串,即我们要拷贝字符串进去的字符串。source指的是源字符串,即需要拷贝的字符串,因为这个源字符是不需要修改的,所以为了避免错误我们就用const修饰。
此函数的返回值是一个char*指针,指向了拷贝后的字符串。
在这里插入图片描述
通过上面的介绍我们在模拟实现strcpy函数时需要注意以下几点:

  1. 源字符串必须包含'\0',同时'\0'也会被拷贝到目标空间。
  2. 要保证目标空间足够大,能放下拷贝来的数据
  3. 保证目标空间可以修改
    在这里插入图片描述
#include<stdio.h>
#include<assert.h> 

void my_strcpy(char* dest,const char* src)
{
    
    
    assert(dest && src);
    while(*dest++ = *src++)
    {
    
    
        ;
    }
}
int main()
{
    
    
    char arr1[]="abcdef";
    char arr2[20]={
    
    0};
    my_strcpy(arr1,arr2);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/2301_77404033/article/details/132722989