自己实现strcpy和strlen函数

简介: 自己实现strcpy和strlen函数

大家可能会遇到这样的题目,不使用C语言库函数来实现拷贝字符串和求字符串长度的功能。本文就是来详细地说明如何模拟实现这两个函数的功能。


strcpy部分


函数的参数形式char* strcpy(char*destination,const char*source);


该参数说明了strcpy返回类型是char类型的指针,将源头(不能被改)拷贝到目的地。


strcpy特点和strlen类似,遇到‘\0’就停止。


比较容易想到的写法是:


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
void my_strcpy(char* a, char* b)
{
  while (*a != '\0')
  {
  *b = *a;
  b++;
  a++;
  }
  *b = *a;
}
int main()
{
  char a[] = "abcdef";
  char b[10];
  my_strcpy(a, b);
  printf("%s", b);
  return 0;
}


虽然可以实现strcpy函数的内容,但是优化不怎么样,将简单的功能写的非常麻烦,且无法避免空指针的情况,下面为优化后的写法:


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<assert.h>
void my_strcpy(char a[],char b[])
{
    assert(a!=NULL&&b!=NULL);//断言函数来避免空指针的情况
  while (*b++ = *a++)
  {
  ;//当*a为\0的时候,while里的值为假,跳出循环
  }
}
int main()
{
  char a[] = "abcdef";
  char b[10]="";//定义第二个数组来拷贝数组
  my_strcpy(a,b);
  printf("%s", b);
  return 0;
}

strlen部分


函数的参数形式 size_t  strlen(const char* str);


size_t表示的是无符号数,const放的位置表示*str所指向的内容不可以被改变。


strlen函数的特点是遇到’\0’就停止了,且只能用来求字符的长度。


比较容易想出来的方法如下所示:


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strlen(const char str[])
{
  int count = 0;
  assert(str != NULL);//这里使用assert断言函数来防止空指针的情况
  while (*str)
  {
  count++;
  str++;
  }
  return count;
}
int main()
{
  char str[10] = "abcdef";
  printf("%d",my_strlen(str));
  return 0;
}


虽然可以实现strlen函数的内容,但是优化不怎么样,将简单的功能写的非常麻烦,且无法避免空指针的情况,下面为优化后的写法:


#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int my_strlen(const char a[])//用const来使代码更加安全
{
  int count = 0;
  while (* a++ != '\0')
  {
  count++;
  }
  return count;
}
int main()
{
  char a[]="abcdef";
  int b = my_strlen(a);
  printf("%d", b);
  return 0;
}


在这里深入讲解一下strlen函数。上面已经提到函数的参数形式 size_t  strlen(const char* str);


而size_t表示的是无符号数,必定是正数。


strlen返回值类型是无符号数,所以strlen("字符串")-strlen("字符串")必是大于0的数。


#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
  size_t count = strlen("chen") - strlen("chendadachen");//得到的结果一定大于0
  printf("count=%u", count);//打印%u时,因为是无符号,所以必定为正数,而正数原码补码相同,打印的是补码。
  return 0;
}


cf19c0329e8097de366f8ca3cc26e1bf_50fe8aac587c43cda1ed14a053afe161.png


如果大家发现代码讲解有问题的话,请一定要不吝赐教告诉我!

db05770fea9187a32c08b0e08e1ae0ab_4d5a154e767b4d5293aaf652acd37ddb.jpeg


相关文章
|
1月前
strlen,strcpy,stract,strcmp,strstr函数的模拟实现
strlen,strcpy,stract,strcmp,strstr函数的模拟实现
24 3
|
17天前
|
C语言
字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现
字符串函数`strlen`、`strcpy`、`strcmp`、`strstr`、`strcat`的使用以及模拟实现
|
1月前
|
存储 编译器 C语言
strlen函数详解
strlen函数详解
20 2
|
5月前
|
存储 Cloud Native Linux
C++ strcpy、sprintf与memcpy的区别
C++ strcpy、sprintf与memcpy的区别
|
9月前
C实现字符操作函数,strcpy, strcat, strcmp, memcpy
C实现字符操作函数,strcpy, strcat, strcmp, memcpy
25 0
|
9月前
|
存储
strcpy函数与strncpy函数
strcpy函数与strncpy函数
|
9月前
再见strlen函数
再见strlen函数
|
11月前
strlen, strcpy,strcmp,strcat,strncpy,strncmp,strncat,strst库函数的详细解析以及模拟实现
🐰strlen 🐰模拟strlen 🐰strcpy 🐰模拟strcpy 🐰strcat 🐰模拟strcat 🐰strcmp 🐰模拟strcmp 🐰strncpy 🐰strncat 🐰strncmp 🐰strstr 🐰模拟strstr
|
安全
strcpy和strncpy的使用以及strcpy的模拟实现(三种方法)
strcpy和strncpy的使用以及strcpy的模拟实现(三种方法)
164 0
strcpy和strncpy的使用以及strcpy的模拟实现(三种方法)