大家可能会遇到这样的题目,不使用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;
}
如果大家发现代码讲解有问题的话,请一定要不吝赐教告诉我!