字符函数和字符串函数(1)

1.字符分类函数

在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提供了一系列函数,接下来我们就学习一下这些函数。

C语言中一系列的函数说专门做字符分类的,也就是一个字符是属于什么类型的字符的。

这些函数都是使用一个头文件是:

ctype.h

在这里插入图片描述
这些函数的使用方法非常类似,我们就讲解一个函数的事情,其他的非常类似:

int islower(int c);

islower是能够判断参数部分的c是否是小写字母的。

通过返回值来说明是否是小写字母,如果是小写字母就返回非0的整数,如果不是小写字母,则返回0.

#include <stdio.h>
#include <ctype.h>
int main()
{
	int ret = islower('A');
	printf("%d\n", ret);
	return 0;
}

结果:0

#include <stdio.h>
#include <ctype.h>
int main()
{
	int ret = islower('A');
	if (ret)
		printf("小写\n");
	else
		printf("大写\n");
	//printf("%d\n", ret);
	return 0;
}

结果:大写

写一个代码,将字符串中的小写字母转大写,其他字符不变。

int main()
{
	//a-97
	//A-65
	char arr[20] = "I am a student";//
	int i = 0;
	while (arr[i])//字符串最后有\0,当运行到\0后不进入程序
	{
		if (islower(arr[i]))
		{
			arr[i] = arr[i] - 32;//变成大写
		}
		i++;
	}
	printf("%s\n", arr);
	return 0;
}

结果:I AM A STUDENT

2.字符转换函数

C语言提供了2个字符转换函数

int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写

上面的代码,我们将小写转大写,是用ASCII来完成效果,有了转换函数,就可以直接使用函数来转换。

int main()
{
	printf("%c\n", tolower('A'));
	return 0;
}

结果:a

那么我们前面的代码就可以换一种方法来写:

int main()
{
	//a-97
	//A-65
	char arr[20] = "I am a student";//
	int i = 0;
	while (arr[i])//字符串最后有\0,当运行到\0后不进入程序
	{
		if (islower(arr[i]))
		{
			//arr[i] = arr[i] - 32;//变成大写
			arr[i] = toupper(arr[i]);
		}
		i++;
	}
	printf("%s\n", arr);
	return 0;
}

结果也是一样的。

接下来,我们后面所学习的都是字符串函数。

3.strlen的使用和模拟实现

size_t strlen ( const char * str )

字符串以‘\0’作为结束标志,strlen函数返回的是在字符串中‘\0’前面出现的字符个数(不包含‘\0’).

给定的起始位置开始向后统计\0之前的字符个数

#include<string.h>
int main()
{
	char arr[] = "abcdef";
	//a b c d e f \0
	printf("%d\n", strlen(arr));
	return 0;
}

参数指向的字符串必须要以‘\0’结束。

注意函数的返回值为size_t,是无符号的

int main()
{
	char arr1[] = "abcdef";
	char arr2[] = "abc";
	if (strlen(arr2) - strlen(arr1) > 0)
	{
		printf(">\n");
	}
	else
		printf("<=\n");
	return 0;
}

结果:>
因为两个都是size_t的类型,都是无符号的数。

有其他两种写法:

if((strlen(arr1)>strlen(arr2)))

if ((int)strlen(arr1) > (int)strlen(arr2))

strlen的使用需要包含头文件

学会strlen函数的模拟实现
①计算器
②指针-指针
③递归的方式

//计数器的方式
#include<assert.h>
size_t my_strlen(const char* str)
{
	size_t count = 0;
	assert(str != NULL);
	while (*str)//不能为空指针,需要断言
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	size_t len = my_strlen(arr);
	printf("%zd\n", len);
	return 0;
}
//指针-指针
#include<assert.h>
size_t my_strlen(const char* str)
{
	char* start = str;//将初始位置存入start中
	assert(str != NULL);
	while (*str)//不能为空指针,需要断言
	{
		str++;//一直让str++直到遇到\0,
	}
	return str-start;
}
int main()
{
	char arr[] = "abcdef";
	size_t len = my_strlen(arr);
	printf("%zd\n", len);
	return 0;
}

递归:
在这里插入图片描述

//递归
//大事化小
size_t my_strlen(const char* str)
{
	if (*str == '\0')
		return 0;
	else
		return 1 + my_strlen(str + 1);
}
int main()
{
	char arr[] = "abcdef";
	size_t len = my_strlen(arr);
	printf("%zd\n", len);
	return 0;
}

4.strcpy的使用和模拟实现

strcpy——string copy-字符串拷贝

char* strcpy(char * destination//目的地, const char * source//源头 );
#include<string.h>
int main()
{
	char arr1[] = "hello world";
	char arr2[30] = { 0 };
	int i = 0;
	//把arr1中的内容,拷贝到arr2中
	strcpy(arr2, arr1);
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	return 0;
}

源字符串必须以‘\0’结束,被拷贝的必须有‘\0’,如果没有‘\0’可能会造成越界访问

会将源字符串中的‘\0’拷贝到目标空间

目标空间必须足够大,以确保能存放源字符串

目标空间必须可修改,常量字符串不可被修改。

#include<string.h>
int main()
{
	char arr1[] = "hello world";
	char arr2[30] = { 0 };
	int i = 0;
	//把arr1中的内容,拷贝到arr2中
	strcpy(arr2, arr1);
	printf("%s\n", arr1);
	printf("%s\n", arr2);
	return 0;
}

学会模拟实现。

//strcpy函数的返回值是char*
//strcpy返回的是目标空间的起始地址
#include<assert.h>
char* my_strcpy(char* dest, const char* src)
{
	char* ret=dest;//存一份起始地址
	assert(dest!=NULL);
	assert(src!=NULL);
	while (*src!='\0')
	{
		*dest = *src;
		dest++;
		src++;
		//优化
		//*dest++=*src++;
	}
	*dest = *src;//放'\0'.
	return ret;
}
//优化:
//char* my_strcpy(char* dest, const char* src)
//{
//	while (*dest++=*src++;)
//	{
//		;
//	}

//}
int main()
{
	char arr1[] = "abcdef";
	char arr2[20] = { 0 };
	my_strcpy(arr2, arr1);
	printf("%s\n", arr2);
	return 0;
}

5.strcat的使用和模拟实现

实现字符串得链接/追加

源字符串必须以’\0’结束。

目标字符串中也得有\0,否则没办法知道追加从哪里开始。

目标空间必须有足够得大,能容纳下源字符串得内容。

目标空间必须可修改。

int main()
{
	char arr1[20] = "hello ";
	strcat(arr1, "world");
	printf("%s\n", arr1);
	return 0;
}

在这里插入图片描述
strcat的追加方式:
1.找到目标空间中的第一个’\0‘.
2.然后从这个\0的位置开始追加源头字符串
3.源头字符串的内容包括\0都会追加到目标空间

模拟实现:

#include<assert.h>
char* my_strcat(char* dest, const char* src)
{
	char* ret = dest;
	assert(dest && src);
	//1.找到目标空间中的\0
	while (*dest != '\0')
		dest++;
	//2.拷贝数据
	while (*dest++ = *src++)
	{
		;
	}
	return ret;
}
int main()
{
	char arr1[20] = "hello";
	my_strcat(arr1, "world");
	printf("%s\n",  arr1);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值