文章目录
前言
上篇文章中介绍了C语言中的字符函数和字符串函数以及它们的使用方法。本文将介绍部分的函数模拟实现。
本文的函数的功能及其格式均在上一篇文中有所提及,请结合两篇文章一起看。上篇文章:C语言字符函数和字符串函数功能介绍(一)
一、strlen函数模拟实现
在模仿strlen实现其功能有以下三种方式:
1.1计数器方式
strlen函数是统计字符串到“\0”结束之前的字符个数。
计时器实现,代码如下:
#include<stdio.h>
int my_strlen(const char* str)
{
int count = 0;
while (*str)
{
count++;
str++;
}
return count;
}
int main()
{
char arr[] = "zxcvbnm";
printf("%d\n", my_strlen(arr));
return 0;
}
1.2不创建临时变量
第一种方法使用了临时变量count,下面将不用临时变量创建函数。
代码如下:
#include<stdio.h>
int my_strlen(const char* str)
{
if (*str == '\0')
return 0;
else
return 1 + my_strlen(str + 1);
}
int main()
{
char arr[] = "zxcvbnm";
printf("%d\n", my_strlen(arr));
return 0;
}
1.3运用指针的方式实现
这种方法则是运用指针的方式去实现。
代码如下:
#include<stdio.h>
int my_strlen(char* str)
{
char* cur = str;
while (*cur!='\0')
{
cur++;
}
return cur - str;//终点减去起点
}
int main()
{
char arr[] = "zxcvbnm";
printf("%d\n", my_strlen(arr));
return 0;
}
二、strcpy函数模拟实现
strcpy函数的返回值是字符指针,在调用函数的返回值时需要注意。在下面的函数实现中我们需判断传来的字符串是否为空用到了断言assert,我们要调用函数头文件<assert.h>。
下面代码的作用是将arr的内容拷贝到arr1中,我们需传入两个字符数组的首地址,之后判断两个字符数组不为空,将arr的内容赋值到arr1中,最后返回起始地址emp。其中const修饰的不能改变其值。
代码如下(示例):
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* des, const char* cur)
{
assert(des!=NULL);
assert(cur!=NULL);
char* emp = des;
while ((*des++ = *cur++));
return emp;
}
int main()
{
char arr[] = "zxcvbnm";
char arr1[20] = { 0 };
printf("%s\n", my_strcpy(arr1,arr));
return 0;
}
三、strcat函数模拟实现
要注意strcat在给自己给自己追加时程序不会出任何结果,程序会崩溃。
下面的程序是给arr1后面追加arr。
代码如下:
#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
char* ret = dest;
assert(dest != NULL);
assert(src != NULL);
//找到目标的'\0'
while (*dest)
{
dest++;
}
while ((*dest++ = *src++));
return ret;
}
int main()
{
char arr[20] = "abcdefg";
char arr1[20] = { 0 };
printf("%s\n", my_strcat(arr1, arr));
return 0;
}
四、strstr函数模拟实现
下面程序是从arr中找arr1的子字符串。
代码如下:
#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{
char* cp = (char*)str1;
char* s1, * s2;
if (!*str2)
return((char*)str1);
while (*cp)
{
s1 = cp;
s2 = (char*)str2;
while (*s1 && *s2 && !(*s1 - *s2))
s1++, s2++;
if (!*s2)
return(cp);
cp++;
}
return NULL;//未找到子字符串
}
int main()
{
char arr[20] = "abcdefg";
char arr1[20] = "cd";
printf("%s\n", my_strstr(arr, arr1));
return 0;
}
五、strcmp函数模拟实现
下面的程序是比较arr1与arr的长度大小。
代码如下:
#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* src, const char* dst)
{
int ret = 0;
assert(src != NULL);
assert(dst != NULL);
while (!(ret = *(unsigned char*)src - *(unsigned char*)dst) && *dst)
++src, ++dst;
if (ret < 0)
ret = -1;
else if (ret > 0)
ret = 1;
return ret;
}
int main()
{
char arr[20] = "abcdefg";
char arr1[20] = "abcd";
printf("%d\n", my_strcmp(arr, arr1));
return 0;
}
六、memcpy函数模拟实现
该程序作用是从arr1的位置开始向后复制2个字节的数据到arr的内存位置。
代码如下:
#include<stdio.h>
#include<assert.h>
void* memcpy(void* dst, const void* src, size_t count)
{
void* ret = dst;
assert(dst!=NULL);
assert(src!=NULL);
while (count--)
{
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
return ret;
}
int main()
{
char arr[20] = "abcdefg";
char arr1[20] = "fghj";
printf("%s\n", memcpy(arr, arr1,2));
return 0;
}
七、memmove函数模拟实现
该函数作用同上个作用相同,不过该函数处理的源内存块和目标内存块是可以重叠的。
代码如下:
#include<stdio.h>
#include<assert.h>
void* memmove(void* dst, const void* src, size_t count)
{
void* ret = dst;
if (dst <= src || (char*)dst >= ((char*)src + count))
{
while (count--) {
*(char*)dst = *(char*)src;
dst = (char*)dst + 1;
src = (char*)src + 1;
}
}
else
{
dst = (char*)dst + count - 1;
src = (char*)src + count - 1;
while (count--) {
*(char*)dst = *(char*)src;
dst = (char*)dst - 1;
src = (char*)src - 1;
}
}
return ret;
}
int main()
{
char arr[20] = "abcdefg";
char arr1[20] = "fghj";
printf("%s\n", memmove(arr, arr1, 6));
return 0;
}
总结
这两篇文章介绍了C语言的字符和字符串函数,以及对部分函数的模拟实现。希望大家可以通过这两篇文章学习到对基本函数的使用。如有不足之处,希望大家可以指点出来.上篇文章:C语言字符函数和字符串函数功能介绍(一)