大家可能会遇到这样的题目,不使用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; }

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

技术
下载桌面版
GitHub
Gitee
SourceForge
百度网盘(提取码:draw)
云服务器优惠
华为云优惠券
腾讯云优惠券
阿里云优惠券
Vultr优惠券
站点信息
问题反馈
邮箱:[email protected]
吐槽一下
QQ群:766591547
关注微信