第十六章(字符和字符串函数)

1. 字符分类函数

2. 字符转换函数

3. strlen的使⽤和模拟实现

4. strcpy的使⽤和模拟实现

5. strcat的使⽤和模拟实现

6. strcmp的使⽤和模拟实现

7. strncpy函数的使⽤

8. strncat函数的使⽤

9. strncmp函数的使⽤

10. strstr的使⽤和模拟实现

                 **明月何时照我还**

在编程的过程中,我们往往会遇见字符和字符串,为了方便我C语言就给我们提供了一系列的函数给我们使用。
接下来我们来一一介绍这些函数

一、字符分类函数
我们使用这些库函数需要包含头文件(ctype.h)
在这里插入图片描述
这些函数的使用方法类似,我们就讲解一个作为例子
在这里插入图片描述
islower函数是能判断参数部分C是否是小写字母的
1.是小写字母就返回非零的整数
2.不是小写字母就返回0

我们来练习一下
写一个代码,把小写变成大写,其它字符不变

#include<ctype.h>
int main()
{
	 char arr [10] = "abcdefEE?,";
	 int ret = sizeof(arr) / sizeof(arr[0]);
	 for(int i = 0 ; i<ret ;i++)
	 {
		 if (islower(arr[i]))   //这里用islower函数判断该字符是不是小写
		 {
			 arr[i] = arr[i] - 32;  //如果是小写就变成大写,不是则不动
		 }
	 }
	 for (int i = 0; i < ret; i++)
	 {
		 printf("%c ", arr[i]);
	 }
	
	return 0;
}

在这里插入图片描述
二、c语言提供了2个字符转换函数
1 . int tolower (int c) : 将参数传进去的大写字母转为小写
2 int toupper (int c ) : 将参数传进去的小写字母转为大写

我们对这两种来分别举例子说明

int main()
{
	char arr[15] = "abcdefgGH,.";
	int ret = sizeof(arr) / sizeof(arr[0]);  //计算数组中的元素个数-
	for (int i = 0; i < ret; i++)
	{
		int c = arr[i];
		if (islower(c) != 0)  //如果是小写就转为满足条件,进入
		{
			arr[i] = toupper(c);   // 进入之后将小写转换为大写
		}
	}

	for (int i = 0; i < ret; i++)
	{
		printf("%c ", arr[i]);
	}
	return 0;
}
int main()
{
	char arr[15] = "ABCDEFGJgGH,.";
	int ret = sizeof(arr) / sizeof(arr[0]);  //计算数组中的元素个数-
	for (int i = 0; i < ret; i++)
	{
		int c = arr[i];
		if (isupper(c) != 0)  //如果是大写就转为满足条件,进入
		{
			arr[i] = tolower(c);   // 进入之后将大写转换为小写
		}
	}

	for (int i = 0; i < ret; i++)
	{
		printf("%c ", arr[i]);
	}
	return 0;
}

接下来的函数是针对字符串的

三、 strlen的使用和模拟实现
在这里插入图片描述
作用:计算字符串的大小
在这里插入图片描述

#include<string.h>
int main()
{
	char a[] = "abcdef./,<>";
	 unsigned int  ret = (unsigned int )strlen(a); //这里需要注意strlen函数的返回值是我无符号的整形
	printf("%u ", ret);    //打印无符号整形用%u 
	return 0;
}

strlen函数的模拟实现
1.计数器

int my_strlen(const char* p)
{
	int count = 0;
 	while ((*p) != '\0')  //遇见\0停止
	{
		count++;   //不是\0就加1;
		p++;
	} 
	return count;
}
int main()
{
	char arr[20] = "abcdeffafdsads";
	int ret = my_strlen(arr); // 数组名是数组首元素的地址
	printf("%d", ret);
	return 0;
}

2.指针减去指针

int my_strlen(const char* p)
{
	const char * a = p;  //先创建一个之指针数组把arr的起始地址储存起来
	while ((*p) != '\0')
	{
		p++;    //地址++,直至访问到最后一个字符的地址
	}
	return(int) (p - a);//指针减去指针是一个数组
}

int main()
{
	char arr[20] = "abcdeffafdsads";
	int ret = my_strlen(arr); // 数组名是数组首元素的地址
	printf("%d", ret);
	return 0;
}

四、strcpy函数的使用和模拟
该函数的头文件是(string.h)
在这里插入图片描述
在这里插入图片描述

#include<string.h>
int main()
{
	char a[] = "abcdefddd";
	char copy [40] = {0};
	char* p = strcpy(copy, a);    //strcpy返回的值是复制后字符串的首元素的地址,我们创建一个指针地址来接收
	printf("%s\n", p);
	 p = strcpy(copy,"dsajdjkoajdsjc....");    
	printf("%s\n", p);
	return 0;
}

strcpy函数的模拟实现

#include<string.h>
#include<assert.h> 
char* my_strcpy(char* p1, const char* p2)  //arr1的数组中的字符串是不能改变的
{
	char* p = p1;//先把目标数组的地址储存起来
	assert(p1 != NULL);  //判断p1和p2是不是数组空地址
	assert(p2 != NULL);   //包含一个头文件
	while ((*p2))
	{
		*p1 = *p2;
			p1++;
			p2++;
	}
	/*while((*p1++ = *p2++))
	{
		; //这两种方式都可以实现
	}*/
	return p;  //

}

int main()
{
	char arr1[] = "afcdasdfassda";
	char arr2[40];
	char *ret = my_strcpy(arr2, arr1);// 函数的返回值得到的是目标字符串的首地址
	printf("%s", ret);

	return 0;
}

五、strcat 的使用和模拟实现

在这里插入图片描述
在这里插入图片描述
5.1
strcat函数的使用

#include<stdio.h>
#include<string.h>
int main()
{
	char arr1[100] = "dajsdasdsakd";//目标字符串的"\0"会被
	char arr2[10] = "abcdef";  //会被该字符串的首字符a替代,然后依次放入arr2中
	char* p = strcat(arr1, arr2);
	printf("%s \n", p);

	char arr3[100] = "abcedsd";
	char arr4[10] = "gge\0fg";  //提前加上\0
	char* p1 = strcat(arr3, arr4);
	printf("%s \n", p1);

	return 0;
}

5.2
strcat函数的模拟实现

char* my_strcat( char* p1, const char* p2)
{
	char* p = p1;  //先把目标字符串的首地址给储存起来
	//这里我们要先得到目标地址的"\0"出,要在其后链接字符串
	assert(p1 != NULL);
	assert(p2 != NULL);

	while ((*p1))
	{
		p1++; 
	}
	while ((*p1++ = *p2++))
	{
		;
	}
	return p;
}

int main()
{
	char arr1[50] = "abcdef";
	char arr2[10] = "lkjhgfda.";
	char *ret  = my_strcat(arr1, arr2);
	printf("%s ", ret);
	return 0;
}

六、strcmp 函数的使用和实现
在这里插入图片描述

比较两个字符串的大小
在这里插入图片描述
strcmp 函数的使用

int main()
{
	char arr1[10] = "abcefg";
	char arr2[10] = "abcefa";  //比的是字符对应的ASCALL的值
	if ((strcmp(arr1, arr2)))
	{
		int a = strcmp(arr1, arr2);
		printf("%d\n", a);
		printf("arr1大于arr2\n");
	}
	char arr3[10] = "abcefg";
	char arr4[10] = "abcefz";
	if ((strcmp(arr1, arr2)))
	{
		int a = strcmp(arr3, arr4);
		printf("%d\n", a);
		printf("arr3小于arr4\n");
	}
	char arr5[10] = "abcefg";
	char arr6[10] =  "abcefg";
	if ((!strcmp(arr5, arr6)))  //这里两者相等返回值为0,为假我们加上!才能正常执行
	{
		int  a = strcmp(arr5, arr6);
		printf("%d\n", a);
		printf("arr5等于arr6\n");
	}

	return 0;
}

strcmp的模拟实现

int my_strcmp(const char* p1, const char* p2)
{
	assert(p1 != NULL);
	assert(p2 != NULL);
	while ((*p1 == *p2))  //如果相等就继续进入判断,
	{
		if (*p1 == '\0')  //当p1遇见\0就提前截止
		{
			return 0;
		}
		p1++;
		p2++;
	}
	return *p1 - *p2;

}
int main()
{
	char arr1[50] = "abcdefllg";   //这里是比较我们不必要改变
	char arr2[10] = "abcdefllz";
	int ret = my_strcmp(arr1, arr2);
	printf("%d\n", ret);
	if (ret > 0)
	{
		printf("arr1>arr2");
	}
	else if (ret < 0)
	{
		printf("arr1<arr2");

	}
	else
	{
		printf("arr1=arr2");
	}

	return 0;
}

七、strncpy 函数的使用
这个与strcpy 有什么不同呢?
在这里插入图片描述

在这里插入图片描述
上代码!

int main()
{
	char a1[50] = "abcdef";
	char a2[10] = "def";
	char * p1 = strncpy (a1, a2, sizeof(a2));//复制2个字符
	printf("%s\n", p1);
	char arr1[50];
	char arr2[30] = "i am a student ";
	char* p2 =  strncpy (arr1, arr2, 5);
	printf("%s\n",p2);
	return 0;
}

八、strncat的使用
在这里插入图片描述
在这里插入图片描述

int main()
{
	char arr1[50];
	char arr2[10];
	strcpy(arr1 , "hello ");  //可以一起使用实现不同的功能
	strcpy(arr2, "i am il;");
	char * p =strncat(arr1, arr2, 4);  //更加灵活了
	printf("%s", p);
	return 0;
}

九、strncmp的函数的使用

在这里插入图片描述

#include<stdio.h>
#include<string.h>
int main()
{

	char arr1[20] = "asdfggh";
	char arr2[20] = "asdfggk";
	int ret = strncmp(arr1, arr2, 7*sizeof(char));
	printf("%d\n", ret);

	return 0;
}

十、strstr的使用和模拟实现
在这里插入图片描述
作用:
查找子字符串
返回指向str1中str2第一次出现的指针,如果str2不是str1的一部分,则返回空指针。匹配过程不包括结束的空字符,但它到此为止。

int main()
{
	char arr[30] = "this is an apple";
	char* pr;
	 pr = strstr(arr, "is");
	printf("%s\n", pr);

	 pr = strstr(arr, "apple");
	printf("%s\n", pr);

	pr = strstr(arr, "er");
	printf("%s\n", pr);
	return 0;
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值