【C语言字符函数和字符串函数(一)】--字符分类函数,字符转换函数,strlen,strcpy,strcat函数的使用和模拟实现

目录

一.字符分类函数

1.1--字符分类函数的理解

1.2--字符分类函数的使用

二.字符转换函数

2.1--字符转换函数的理解

2.2--字符转换函数的使用

三.strlen的使用和模拟实现

3.1--strlen的使用演示

3.2--strlen的返回值

3.3--strlen的模拟实现

四.strcpy的使用和模拟实现

4.1--strcpy的使用演示

4.2--strcpy的模拟实现

五.strcat的使用和模拟实现

5.1--strcat的使用演示

5.2--strcat的模拟实现


🔥个人主页:************@草莓熊Lotso的个人主页****************

🎬作者简介:C++研发方向学习者

📖个人专栏:************《C语言》****************

⭐️人生格言:生活是默默的坚持,毅力是永久的享受。


一.字符分类函数

1.1--字符分类函数的理解

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

这些函数的使用都需要包含头文件ctype.h

1.2--字符分类函数的使用

这些函数的使用方法十分类似,在这里以一个函数为例,其它的都很类似:

  1. int islower ( int c );

islower是用来判断参数部分的C是不是大小写的,通过返回值来说明是不是小写字母,如果是就返回非零整数,如果不是就返回0;

练习:

写一个代码,将字符串中的小写字符全部转为大写,其它字符不变。

cpp 复制代码
#include<stdio.h>
#include<ctype.h>
int main()
{
	int i = 0;
	char arr[] = "I am a GENIUS";
	while (arr[i])
	{
		if (islower(arr[i]))
			arr[i] -= 32;//小写字母和大写字母的Ascll码值差32
		printf("%c", arr[i]);
		i++;
	}
	return 0;
}

二.字符转换函数

2.1--字符转换函数的理解

--C语言提供了2个字符转换函数:(也需要包含头文件ctype.h)

  1. int tolower ( int c ); *//*将参数传进去的大写字母转小写

*2.*int toupper ( int c ); *//*将参数传进去的小写字母转大写

上面我们将小写转大写,是利用了小写字母和大写字母的Ascll码值差32的性质,有了转换函数,就可以直接使用toupper函数实现小写转大写了。

2.2--字符转换函数的使用

练习:

写一个代码,利用字符转换函数将字符串中的小写字符全部转为大写,其它字符不变。

cpp 复制代码
#include<stdio.h>
#include<ctype.h>
int main()
{
	int i = 0;
	char arr[] = "I am a GENIUS";
	while (arr[i])
	{
		if (islower(arr[i]))
			arr[i]=toupper(arr[i]);
		printf("%c", arr[i]);
		i++;
	}
	return 0;
}

三.strlen的使用和模拟实现

  1. size_t strlen ( const char * str );

**功能:**统计参数str指向的字符串的长度,统计的是字符串中 '\0' 之前的字符的个数。

**参数:**str指针,指向了要统计长度的字符串。

**返回值:**返回了str指向的字符串的长度,返回的长度不会是负数,所以返回类型是size_t。

3.1--strlen的使用演示

cpp 复制代码
#include<stdio.h>
#include<string.h>

int main()
{
	const char* str = "abcdef";
	printf("%zd\n", strlen(str));//6
	return 0;
}

使用注意事项:

  • 字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包
  • 含 '\0' )。
  • 参数指向的字符串必须要以 '\0' 结束。
  • 注意函数的返回值为 size_t,是无符号的( 易错 )
  • strlen的使用需要包含头文件<string.h>

3.2--strlen的返回值

--strlen函数的返回值为 size_t,是无符号的( 易错 ),那为什么说它易错呢,我们来通过一串代码直观了解一下吧

cpp 复制代码
#include <stdio.h>
#include <string.h>
int main()
{
	const char* str1 = "abcdef";
	const char* str2 = "bbb";
	if (strlen(str2) - strlen(str1) > 0)
	{
		printf("str2>str1\n");
	}
	else
	{
		printf("srt2<str1\n");
	}
	return 0;
}

错误理解:按一般的想法来说,strlen(str2)-strlen(str1)应该是-3,小于0,所以打印srt2<str1,但是其实不是,我们来看看运行的结果:

我们会发现结果是str2>str1,这正是因为strlen函数的返回类型是size_t类型,始终大于0,strlen(str2)-strlen(str1)的结果也是size_t类型的,所以也是大于0,直接打印出str2>str1。不过改成strlen(str2)>strlen(str1)就会打印出srt2<str1了。当然也有别的理解方法,这里就不多讲了。

3.3--strlen的模拟实现

方法1:

cpp 复制代码
//用计数器的方法
#include<stdio.h>
#include<assert.h>
size_t mystrlen(const char* str)
{
	int count = 0;
  assert(str!=NULL);
	while (*str)
	{
		count++;
		str++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	size_t ret = mystrlen(arr);
	printf("%d", ret);
	return 0;
}

方法2:

cpp 复制代码
//用指针减指针
#include<stdio.h>
#include<assert.h>
size_t mystrlen(char* str)
{
	assert(str != NULL);
	char* p = str;
	while (*p)
	{
		p++;
	}
	return p - str;
	
}
int main()
{
	char arr[] = "abcdef";
	size_t ret = mystrlen(arr);
	printf("%d", ret);
	return 0;
}

方法三:

cpp 复制代码
//不创建临时变量,用递归做
#include<stdio.h>
#include<assert.h>
size_t mystrlen(const char* str)
{
	assert(str != NULL);
	if (*str == '\0')
	{
		return 0;
	}
	else
	{
		return 1 + mystrlen(str + 1);
	}

}
int main()
{
	char arr[] = "abcdef";
	size_t ret = mystrlen(arr);
	printf("%d", ret);
	return 0;
}

四.strcpy的使用和模拟实现

  1. char * strcpy (char * destination, const char * source );

**功能:**字符串拷贝,将源头的字符串拷贝到目标空间中,拷贝到源头字符串中的 '\0' 为止。

参数: destination指针,指向目的地空间;source指针,指向源头数据。

**返回值:**strcpy函数返回的目标空间的起始地址。

4.1--strcpy的使用演示

cpp 复制代码
#include <stdio.h>
#include <string.h>

int main()
{
	char arr1[20] = { 0 };
	char arr2[] = "hello";
	char*p=strcpy(arr1, arr2);
	printf("%s\n", p);
	printf("%s\n", arr1);
	//两种打印方式都可以
	return 0;
}

使用注意事项:

  • 源字符串必须以 '\0' 结束。
  • 会将源字符串中的 '\0' 拷贝到目标空间。
  • 目标空间必须足够大,以确保能存放源字符串,[ ]里不能为空。
  • 目标空间必须可修改,比如用char*p="xxxxxxxxxxxx"就不行,无法修改

4.2--strcpy的模拟实现

cpp 复制代码
#include<stdio.h>
#include<assert.h>

char* mystrcpy(char* arr1, const char* arr2)
{
	assert(arr1&&arr2);
	char* p = arr1;
	while ((*arr1++ = *arr2++))
	{
		;
	}
	return p;
}
int main()
{
	char arr1[20] = "xxxxxxxxxxxxxx";
	char arr2[] = "abcdef";
	char* ret = mystrcpy(arr1, arr2);
	printf("%s", ret);
	return 0;
}
//1.参数顺序
//2.函数的功能,停⽌条件
//3.assert
//4.const修饰指针
//5.函数返回值
//6.题⽬出⾃《⾼质量C/C++编程》书籍最后的试题部分

五.strcat的使用和模拟实现

  1. char * strcat (char * destination, const char * source );

**功能:**字符串追加,把source指针的源字符串中的所有字符都追加到destination指向的空间中。

**参数:**destination指针,指向目的地空间;source指针,指向源头数据。

**返回值:**strcat函数返回的目标空间的起始地址。

5.1--strcat的使用演示

cpp 复制代码
#include <stdio.h>
#include <string.h>

int main()
{
	char arr1[20] = "hello";
	char arr2[] = "world";
	char* p = strcat(arr1, arr2);
	printf("%s\n", p);
	printf("%s\n", arr1);
	//两种打印方式都可以
	return 0;
}

使用注意事项:

  • 源字符串必须以 '\0' 结束。
  • 目标字符串中也得有 \0 ,否则没办法知道追加从哪里开始。
  • 目标空间必须有足够的大,能容纳下源字符串的内容,[ ]里不能为空。
  • 目标空间必须可修改,比如用char*p="hello"就不行,无法修改

5.2--strcat的模拟实现

cpp 复制代码
#include<stdio.h>
#include<assert.h>

char* mystrcat(char* arr1, const char* arr2)
{
	assert(arr1 && arr2);
	char* p = arr1;
	while (*arr1)
	{
		arr1++;
	}//找到目标字符串中的\0,明确从那里开始追加。
	while ((*arr1++ = *arr2++))
	{
		;
	}
	return p;
}
int main()
{
	char arr1[20] = "hello";
	char arr2[] = "world";
	char* ret = mystrcat(arr1, arr2);
	printf("%s", ret);
	return 0;
}

往期回顾节选:

【C语言指针超详解(六)】--sizeof和strlen的对比,数组和指针笔试题解析,指针运算笔试题解析

【趣味小游戏】--扫雷游戏

结语:本篇文章就到此结束了,继前面几篇文章后,在此篇文章中给大家分享了字符分类函数,字符转换函数,strlen,strcpy,strcat函数的使用和模拟实现等知识点,后续会继续分享字符函数和字符串函数的相关知识点,如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持。

相关推荐
jerry6098 分钟前
LLM笔记(五)概率论
人工智能·笔记·学习·概率论
nlog3n13 分钟前
Go语言交替打印问题及多种实现方法
开发语言·算法·golang
kaixin_learn_qt_ing17 分钟前
Golang
开发语言·后端·golang
ddd...e_bug19 分钟前
Shell和Bash介绍
开发语言·bash
烧火大爷26 分钟前
现代计算机图形学Games101入门笔记(十四)
笔记
C4程序员1 小时前
Java百度身份证识别接口实现【配置即用】
java·开发语言
unityのkiven1 小时前
C++中的虚表和虚表指针的原理和示例
开发语言·c++
炒空心菜菜1 小时前
MapReduce 实现 WordCount
java·开发语言·ide·后端·spark·eclipse·mapreduce
(・Д・)ノ1 小时前
python打卡day27
开发语言·python
芯眼2 小时前
STM32启动文件详解(重点)
java·开发语言·c++·stm32·单片机·mybatis