小新喊你了解字符串函数了(一)

​​​​​​​

✨✨小新课堂开课了,欢迎欢迎~✨✨

🎈🎈养成好习惯,先赞后看哦~🎈🎈

所属专栏:http://t.csdnimg.cn/Oytke

小新的主页:编程版小新-CSDN博客

接着字符函数,小新又开始了新的课程教学,就和小新一起来学习字符串函数吧。

1.strlen函数的使用和模拟实现

size_t  strlen(conest  char  *  str)

注意:strlen是用来计算字符串长度的,即计算'\0'之前字符的个数

        参数指向的字符串必须要包含'\0'

        返回类型是size_t,无符号整型

        使用时要包含头文件<string.h>

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

int main()
{
	conest char str1[] = "labixiaoxin";
	conest char str2[] = "xiaokui";
	if (strlen(str1) - strlen(str2) > 0)
	{
		printf("str1>str2\n");
	}
	else if (strlen(str1) - strlen(str2) < 0)
	{
		printf("str1<str2\n");
	}
	else
	{
		printf("str1=str2");
	}

	return 0;
}

        模拟实现1:模拟实现计数器

#include<stdio.h>
#include<string.h>
#include<assert.h>
int my_strlen(const char* str)
{
	assert(str);
	int count = 0;
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}
//模拟实现计数器
int main()
{
	char str[] = "xiaokui";
	int ret = my_strlen(str);
	printf("%d\n", ret);
	return 0;
}

模拟实现2: 不能创建临时变量的计数器(递归)

#include<stdio.h>
#include<string.h>
#include<assert.h>
//不能创建临时变量的计数器
int my_strlen(const char* str)
{
	assert(str);
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str+1);
}


int main()
{
	char str[] = "xiaokui";
	int ret = my_strlen(str);
	printf("%d\n", ret);
	return 0;
}

模拟实现3:指针-指针

指针-指针  绝对值  两地址之间元素的个数 

#include<stdio.h>
#include<assert.h>
//指针-指针
int my_strlen(const char* str)
{
	assert(str);
	char* p = str;
	while (*str)
	{
		str++;
	}
	return str - p;

}
int main()
{
	char str[] = "xiaokui";
	int ret = my_strlen(str);
	printf("%d\n", ret);
	return 0;
}

2.strcpy函数的使用和模拟实现 

char* strcpy(char* destination, conest char* source)

字面意思就是把source拷贝到destination中去,这个字符串函数的功能就是拷贝字符串,也可以理解为字符串的覆盖,用source中的字符串去把原本destination中的字符串覆盖,下面小新带着大家看代码。

注意:源字符串中必须要有'\0'

           strcpy会到源字符串中的'\0'拷贝到目标空间中

           要包含头文件<string.h>

          目标空间必须足够大,并且目标空间必须可修改

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	char str1[20] = { 0 };
	const char str2[] = "labixiaoxin";
	strcpy(str1, str2);
	printf("%s", str1);
	return 0;
}

下面看strcpy的模拟实现:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcpy(char* str1, const char* str2)
{
	char* p = str1;
	assert(str1 != NULL);
	assert(str2 != NULL);
	//拷贝'\0'之前的内容
	while (*str1++ = *str2++)
	{
		;
	}
	*str1 = *str2;//拷贝'\0'
	return p;
}

int main()
{
	char str1[20] = { 0 };
	const char str2[] = "labixiaoxin";
	 my_strcpy(str1, str2);
	 printf("%s", str1);
	return 0;
}

 3.strcat函数的使用和模拟实现

char * strcat ( char * destination, const char * source )

strcat函数是用来拼接字符串的,也就是把一个字符串放入另一个字符串的后面

注意:源字符串必须以'\0'结尾

          目标空间也要包含'\0',以方便追加'\0\,把源字符串拼接过去

          目标空间要足够大,能够放进源字符串

          要求目标空间可以修改

          要包含头文件<string.h>

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>

int main()
{
	char str1[30] = "labixiaoxin";
	const char str2[] = "xihuanxiaobai";
	strcat(str1, str2);
	printf("%s\n", str1);//labixiaoxinxihuanxiaobai
	return 0;
}

小新:下面请看模拟实现

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcat(char* str1, const char* str2)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	char* p = str1;
	while (*str1)
	{
		str1++;
	}
	while (*str1++ = *str2++)
	{
		;
	}
	return p;
}

int main()
{
	char str1[30] = "labixiaoxin";
	const char str2[] = "xihuanxiaobai";
	 my_strcat(str1, str2);
	printf("%s\n", str1);
}

4.strcmp函数的使用和模拟实现 

int strcmp ( const char * str1, const char * str2 );

可知strcmp返回的是整型,我们该怎么知道str1和str2的大小呢,答案是看strcmp返回值的大小。

Return Value

Returns an integral value indicating the relationship between the strings:

return valueindicates
<0the first character that does not match has a lower value in ptr1 than in ptr2
0the contents of both strings are equal
>0the first character that does not match has a greater value in ptr1 than in ptr2

str1>str2:返回一个大于0 的整数

str1<str2:返回一个小于0的整数

str1==str2:返回0 

那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩。

两个字符串的比较是一个一个比较的,遇到相同的字符时继续向下比较('\0'除外),直到遇到不同的字符时,比较两个字符所对应的ASCII码值的大小,字符大的对应的字符串就大,这个和字符串的长度没啥太大的关系。如果是"abcd"和"abcdef"比较,那这就和字符串的长度有关系了。

下面小新用代码给大家举例

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>

int main()
{
	const char* str1 = "abcde";
	const char *str2 = "abcdf";
	int ret1 = strcmp(str1, str2);
	printf("%d\n", ret1);//-1

	const char* str3 = "abc";
	const char* str4 = "abc";
	int ret2 = strcmp(str3, str4);
	printf("%d\n", ret2);//0

	const char* str5 = "abcdrfgh";
	const char* str6 = "b";
	int ret3 = strcmp(str5, str6);
	printf("%d\n", ret3);//-1

	return 0;
}

小新:模拟实现如下

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>

int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	while (*str1 == *str2)//注意
	{
		if (*str1 == '\0')//*str1=='\0'说明*str2也是'\0'
			return 0;
		str1++;
		str2++;
	}
	return *str1 - *str2;
}

int main()
{
	const char* str1 = "abcde";
	const char *str2 = "abcdf";
	int ret1 = my_strcmp(str1, str2);
	printf("%d\n", ret1);//-1
	return 0;
}

上面的2,3,4是和下面要介绍的函数是差不多的,就是多了一个参数,用法很相似。 

5.strncpy函数的使用

 char * strncpy ( char * destination, const char * source, size_t num );

num决定的就是你要拷贝的个数,就是多传了一个决定个数的参数。

拷⻉num个字符从源字符串到⽬标空间。如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个 

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	char str1[20] = { 0 };
	const char str2[] = "labixiaoxin";
	strncpy(str1, str2,4);
	printf("%s", str1);//labi
	return 0;
}

6.strncat函数的使用 

 char * strncat ( char * destination, const char * source, size_t num );

 将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字 符

如果source指向的字符串的⻓度⼩于num的时候,只会将字符串中到  \0 的内容追加到destination指向的字符串末尾,即有多少追加多少。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

int main()
{
	char str1[30] = "labixiaoxin";
	const char str2[] = "xihuanxiaobai";
	strncat(str1, str2,5);
	printf("%s\n", str1);//labixiaoxinxihuan
	return 0;
}

7.strncmp函数的使用

int strncmp ( const char * str1, const char * str2, size_t num );

⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
	const char* str1 = "abcde";
	const char* str2 = "abcdf";
	int ret1 = strncmp(str1, str2,4);
	printf("%d\n", ret1);//0

	const char* str3 = "abc";
	const char* str4 = "abc";
	int ret2 = strncmp(str3, str4,1);
	printf("%d\n", ret2);//0

	const char* str5 = "abcdrfgh";
	const char* str6 = "b";
	int ret3 = strncmp(str5, str6,2);
	printf("%d\n", ret3);//-1

	return 0;
}

还剩下四个字符串函数放到下次说,今天就先消化这么多吧,剩下的两个要比前面的难一些,但是跟着小新准没错,下次见~

  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值