字符串函数:strlen,strcmp,strcat,strcpy与strcnmp,strncat,strncpy在使用上的区别与联系

一、strlen函数的使用以及模拟实现

在使用字符串函数strlen求字符串长度的时候,往往会用#include<string.h>中的内置函数,但是,你知道strlen函数怎么模拟实现的嘛,这里给出了两种方法

第一种,是从第一个字符开始,找到最后一个字符后面字符的指针(最后一个字符的后面是一个'\0'),然后借用指针指向的关系,最后一个字符的下一个指针-第一个字符的指针=字符串长度。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
//方法一:
int my_strlen(char* str1)
{
	char* ret = str1;
	while (*str1 != '\0')
	{
		str1++;
	}
	return str1 - ret;
}
int main()
{
	char str1[] = "abcdef";
	int ans = my_strlen(str1);
	printf("%d", ans);
	return 0;
}

第二种方法,利用的是函数的递归实现的。首先递归出口就是'\0',当字符串遇到'\0'时,字符串跳出递归,当字符不是'\0'时,1+my_len(下一个字符的指针)。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int my_strlen(char* str1)
{
	if (*str1 == '\0')
		return 0;
	else
		return 1 + my_strlen(str1+1);
}
int main()
{
	char str1[] = "abcdef";
	int ans = my_strlen(str1);
	printf("%d", ans);
	return 0;
}

 二、strcmp和strncmp的使用和模拟实现及区别

1.strcmp是一个字符串比较函数,比较两个字符串的各自对应字符的大小

2.strncmp多了一个参数,num,比较俩个字符串的前num个字符,用法和strcmp一样,只不过前提条件变成了比较前num个字符

模拟实现strcmp: 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
int my_strcmp(const char* str1, const char* str2)
{
	while (*str1 == *str2)
	{
		if (*str2 == '\0')   //相同的时候,判断是否都为'\0'
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}
int main()
{
	char str1[] = "ab";
	char str2[] = "abc";
	int ans = my_strcmp(str1, str2);
	if (ans > 0)
		printf(">\n");
	else if (ans < 0)
		printf("<\n");
	else
		printf("=\n");
	return 0;
}

三、strcat和strncat的使用和模拟实现

1.strcat是一个连接两个字符长的函数,strcat(str1,str2)是将str2连接到str1的后面,并在这个连接后的字符串后面加上一个'\0',下面是strcat使用的一些前提。

模拟实现strcat: 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
char* my_strcat(char* dest, char* src)
{
	char* ret = dest;
	while (*dest)   //找str2的'\0'的位置
		dest++;
	while (*dest++ = *src++);

	return ret;
}
int main()
{
	char str1[] = "abcdef";
	char str2[20] = "12345";
	char * p = my_strcat(str2, str1);
	printf("%s", str2);
	return 0;
}

2. strncat和strcat的用法一样,但是追加的字符是可以控制,和strcmp中的num一样,追加str2前num个字符,但是最后也要加一个'\0'.

模拟实现strncat:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
char* my_strncat(char* str1, char* str2, size_t num)
{
	char* ret = str1;
	while (*str1)
		str1++;    //找到'\0'的位置
	while (num)
	{
		*str1 = *str2;
		str1++;
		str2++;
		num--;
	}
	*str1 = '\0';    //别忘记,str1是字符串,最后要加上'\0'
	return ret;
}
int main()
{
	char str1[20] = "abcdef";
	char str2[] = "12345";
	char* ret = my_strncat(str1, str2+2, 3);
	printf("%s\n", ret);
	return 0;
}

四、strcpy和strncpy的使用和模拟实现

1.strcpy是一个复制函数,strcpy(str1,str2)将str2中的字符复制到str1中。

2.strcpy是一个用法和strncpy一样的复制函数,但是这个复制可以控制复制的字符个数,它会复制str2中前num个字符到str1中.

 模拟实现strcpy:

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
char* my_strcpy(char* dest, char* src)
{
	char* ret = dest;
	while (*dest++ = *src++);
	return ret;

}
int main()
{
	char str[10] = "abcdef";
	char src[10] = "1234";
	char *p = my_strcpy(str, src);
	printf("%s", str);
	return 0;
}

模拟实现strncpy: 

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
char* my_strncpy(char* str1, const char* str2, size_t num)
{
	char* ret = str1;
	while (num)
	{
		*str1 = *str2;
		str1++;
		str2++;
		num--;
	}
	return ret;
}
int main()
{
	char str1[20] = "abcdef";
	char str2[20] = "1234";
	char* ret = my_strncpy(str1, str2, 3);
	printf("%s\n", ret);
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值