【C语言初阶】实现和模拟字符串函数:strlen函数,strcpy函数,strcat函数,strcmp函数

  • 目录
    1.实现和模拟strlen函数
    2.实现和模拟strcpy函数
    3.实现和模拟strcat函数
    4.实现和模拟strcmp函数

(1)实现和模拟strlen函数
strlen的作用:strlen所作的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符’\0’为止,然后返回计数器值(长度不包含’\0’)。
一.代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int main() {
	char arr1[20] = "abcdef";
	int len=strlen(arr1);
	printf("%d\n", len);
	return 0;
}

二.运行结果:在这里插入图片描述
接下来是模拟strlen函数:
一.代码:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
int my_strlen(char* str) {
	int count = 0;
	while (*str++) {//如果*str为'\0',为假,就退出循环
		count++;
	}
	return count;
}
int main() {
	char arr[20] = "abcdef";
	int len=my_strlen(arr);
	printf("%d\n", len);
	return 0;
}

二.运行结果:
在这里插入图片描述
上述的strlen还是很简单的,接下来让我们一起看看strcpy函数
(2)实现和模拟strcpy函数
strcpy的作用:对字符串进行复制(拷贝),把含有"0"结束符的字符串复制到另一个地址空间,返回值的类型为"char*"。
原型声明: char* strcpy(char* strDestination, const char* strSource)
一.代码:

#include<stdio.h>
#include<string.h>
int main() {
	char arr1[20] = "xxxxxxxx";//这里定义的数组必须超过六个元素
	char arr2[] = "hello";     //才能把hello和'\0'放下
	strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

二.运行结果:
在这里插入图片描述
接下来是模拟strcpy函数:
一.代码(void类型):
a.

#include<stdio.h>
#include<string.h>
void my_strcpy(char* dest,const char* str) {
	while (*dest++ = *str++) {//这里是将arr1的元素换成arr2中的元素
		;                     //*dest和*str得位置不能换
	}
}
int main() {
	char arr1[20] = "xxxxxxxx";
	char arr2[] = "hello";
	my_strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

char*类型
b.

#include<stdio.h>
#include<string.h>
char* my_strcpy(char* dest,const char* str) {
	char* ret = dest;//返回的是目标函数的首地址
	while (*dest++ = *str++) {
		;
	}
	return ret;
}
int main() {
	char arr1[20] = "xxxxxxxx";
	char arr2[] = "hello";
	my_strcpy(arr1, arr2);
	printf("%s", arr1);
	return 0;
}

二.运行结果:
在这里插入图片描述
(3)实现和模拟strcat函数
strcat函数的作用:复制一个字符串,将这个字符串拼接在另一个字符串后面

一.代码:

#include<stdio.h>
#include<string.h>
int main(){
	char arr1[20] = "abc";
	char arr2[10] = "de";
	char arr3[10] = "f";
	strcat(arr1, strcat(arr2, arr3));
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	printf("%s\n", arr3);
	return 0;
}

二.运行结果:
在这里插入图片描述
接下来是模拟strcat函数:
一.代码:

#include<stdio.h>
#include<string.h>
char* my_strcat(char* dest,const char*str) {
	char* ret = dest;
	while (*dest!='\0') {
		dest++;
	}
	while (*dest++=*str++) {//开始在arr1后面连接arr2
		;
	}
	return ret;
}
int main(){
	char arr1[20] = "abc";
    char arr2[10] = "de";
    char arr3[10] = "f";
	my_strcat(arr1, my_strcat(arr2, arr3));
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	printf("%s\n", arr3);
	return 0;
}

二.运行结果:
在这里插入图片描述
好的,我们还剩最后一个strcmp函数了
(4)实现和模拟strcmp函数
strcmp函数的作用:用于比较两个字符串的ASCll值并根据比较结果返回整数。基本形式为strcmp(str1,str2),若str1=str2,则返回零;若str1<str2,则返回负数;若str1>str2,则返回正数
先比较第一个元素的ASCll值,如果str1大于str2,就返回1;就不用继续比较后面的字符了。
例如:下面的代码"m"和"abc"比较,因为m的ASCll值大于a,故返回1。
一.代码:

#include<stdio.h>
#include<string.h>
int main() {
    char arr1[20] = "abc";
    char arr2[20] = "abc";
    char arr3[20] = "m";
    char arr4[20] = "abf";
    printf("%d\n", strcmp(arr1, arr2));
    printf("%d\n", strcmp(arr1, arr4));
    printf("%d\n", strcmp(arr3, arr1));
    return 0;
}

二.运行结果:
在这里插入图片描述

模拟strcmp函数:
一.代码:

#include<stdio.h>
int my_strcmp(const char* str1, const char* str2) {
    while (*str1 && *str2) {//如果*str1或者*str2为'\0',就退出循环
        if (*str1 > *str2)
            return 1;
        else if (*str1 < *str2)
            return -1;
        else {
            str1++;
            str2++;
        }
    }
        if (*str1)//*str2已经比较完了,都和*str1相同,但*str1还剩
            return 1;
        else if (*str2)
            return -1;
        else
            return 0;
}
int main() {
    char arr1[20] = "abc";
    char arr2[20] = "abc";
    char arr3[20] = "m";
    char arr4[20] = "abf";
    char arr5[20] = "abcd";
    printf("%d\n", my_strcmp(arr1, arr2));
    printf("%d\n", my_strcmp(arr3, arr1));
    printf("%d\n", my_strcmp(arr2, arr4));
    printf("%d\n",my_strcmp(arr1, arr5));
    return 0;
}

二.运行结果:
在这里插入图片描述
好了,这就是全部的内容。谢谢大家的观看,希望对大家有所帮助。我还是一个小白,正在努力的学习当中,希望大家能给我一些宝贵的建议。谢谢!

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值