了解字符串函数strlen,strcpy,strcat,并模拟实现

strlen

求字符串的长度,在目标空间中逐个阅历,直到遇到'\0'停止,所以这是在模拟实现时的关键,在模拟实现strlen函数时也要注意它的返回值时 size_t指的是unsigned int,当然我们在实现时候可以直接用int 但是在涉及计算会出现问题哦

比如:

点击查看代码,并想一想答案
int main()
{
  char arr1[]="abcdef";
  char arr2[]="wpf";
  if(strlen(arr2)-strlen(arr1)>0)
  {
    printf("T");
  }
  else
  {
    printf("F");
  }

  return 0;
}

 

如果你去运行,你会发现结果是 T,这就是返回类型不同的原因

strlen的模拟实现有三种

1 是计数计算法,用变量count来计算长度

点击查看代码
#include<stdio.h>
#include<assert.h>
int my_strlen(char*str)//也可以用 size_t或者unsigned int 
{
  int count=0;
  assert(arr!=NULL);//避免出现空指针,造成代码错误
  while(*str!='\0')
  {
    str++;
    count++;
  }
        
}
int main()
{
  char arr[]="abcdef";
  int ret=my_strlen(arr);
  return 0;
}

2,是用递归实现

如果找到字符串‘\0'即返回0,否则的返回1+再次调用该函数并将目标初始指针加一

点击查看代码
#include<stdio.h>
#include<assert.h>
int my_strlen(char*str)
{
  assert(str!=NULL);
  if(*str='\0')
    return 0;
  else
    return 1+my_strlen(str+1);
     
}
int main()
{
  char arr[]="abcdef";
  int ret=my_strlen(arr);
  return 0;
}

3,利用指针运算,首先找到目标初指针,在阅历到字符串为‘\0’ 的指针,反回它们的差值

点击查看代码
#include<stdio.h>
#include<assert.h>
int my_strlen(char*str)
{
  assert(str);
  char*tmp=str;
  while(*str!='\0')
  {
    str++;
  }
  return str-tmp;
}

int main()
{
  char arr[]="abcdef";
  int ret=my_strlen(arr);
  printf("%d\n",ret);
  return 0;
}

strcpy

字符串拷贝,从源字符串拷贝到目标字符串

值得注意的是,在拷贝过程中 源字符串的‘’\0‘也要拷贝进去

也要了解它的返回类型为

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

模拟实现

我们知道当数组被函数运用是调用的是数组首个元素的地址,因此将目标字符串首地址解引用等于源字符串,然后同时++;

直到源字符串的‘\0’赋予给目标字符串,循环结束。

点击查看代码
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char*dest,const char*scr)
{
  assert(scr);
  assert(dest);
  char* tmp=dest;
  while((*dest++=*scr++))
  {
    ;
  }
  return tmp;
}
int main()
{
  char arr1[]="abcdef";
  char arr2[]="wpf";
  my_strcpy(arr1,arr2);
  printf("%s\n",arr1);
  return 0;
}

由此代码也可以发现 目标字符串的空间必须足够容纳源字符串,否则会出现越界访问的问题!!

strcat

称作字符串追加,一般将源字符串追加在目标字符串的后面,需要与strncat作区别

注意:目标字符串必须要有足够的空间让源字符串拷贝进去,包括‘\0’

           返回类型为char*,可能你会对它有些奇怪,不过看完代码,你会发现返回类型这样写,挺有意思的!!

代码实现

点击查看代码
#include<stdio.h>
#include<assert.h>
char* my_strcat(char*dest,const char*scr)
{
  assert(dest);
  assert(scr);
  char*tmp=dest;//为了保存目标字符串的首地址,避免后面的运行找不到
  while(*dest!=='\0')
  {
    dest++;
  }
  while((*dest++=*scr++))
  {
    ;
  }
  return tmp;//重新返回dest的地址
}
int main()
{
  char arr1[30]="hello";//保证目标字符串的空间足够大
  char arr2[]="wpf";
  my_strcat(arr1,arr2);
  printf("%s\n",arr1);
  return 0;
}
上一篇:20211104 指针模仿strcat strncat函数


下一篇:C语言 strcat 函数 - C语言零基础入门教程