C语言进阶版第12课—字符函数和字符串函数1

news2024/9/28 7:15:24

文章目录

  • 1. 字符分类函数
    • 1.1 库函数iscntrl
    • 1.2 库函数isspace
    • 1.3 库函数islower和isupper
  • 2. 字符转换函数
  • 3. strlen函数的使用和模拟实现
    • 3.1 strlen函数的使用
    • 3.2 strlen函数的模拟实现
  • 4. strcpy函数的使用和模拟实现
    • 4.1 strcpy函数的使用
    • 4.2 strcpy函数的模拟实现
  • 5. strcat函数的使用和模拟实现
    • 5.1 strcat函数的使用
    • 5.2 strcat函数的模拟实现
  • 6. strcmp函数的使用和实现
    • 6.1 strcmp函数的使用
    • 6.2 strcmp函数的模拟实现
  • 7. strncpy函数的使用
  • 8. strncat函数的使用
  • 9. strncmp函数的使用

1. 字符分类函数

  以下这些分类函数的头文件是ctype.h

函数如果函数参数符合下列条件则返回true
iscntrl任何控制字符
isspace空白字符‘ ’、换页‘\f’、换行’\n’、回车‘\r’、制表符’\t’、垂直制表符’\v’
isdigit十进制数字0~9字符
isxdigit十六进制数字,包括所有十进制数字字符,小写字母a~f,大写字母A~F
islower小写字母a~z
isupper大写字母
isalpha字母a~z或A~Z
isalnum字母或者数字,a~z,A~Z,0~9
ispunct标点符号,任何不属于数字或字母的图形字符(可打印)
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符

1.1 库函数iscntrl

在这里插入图片描述


在这里插入图片描述

1.2 库函数isspace

在这里插入图片描述


在这里插入图片描述

1.3 库函数islower和isupper

  • int islower( int c) 用来判断c是否为小写字母,是就返回大于0的数,即true,否则返回0(flase)
  • int isupper( int c) 用来判断c是否为大写字母,是就返回大于0的数,即true,否则返回0(flase)
  • 大小写字母转换
    在这里插入图片描述
  • 上述代码全是小写字母,从而可以利用大小写字母之间的差值32进行转换
  • 如果字符串既有大写又有小写呢?
    在这里插入图片描述
    在这里插入图片描述

2. 字符转换函数

  • int tolower( int c );将参数传进去的大写字母转换为小写
  • int toupper( int c );将参数传进去的小写字母转换为大写
    在这里插入图片描述
    在这里插入图片描述

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

3.1 strlen函数的使用

  • size_t strlen ( const char* str)
  • strlen函数计算的是字符串中’\0’之前的字符个数,不包含’\0’
  • strlen函数的返回类型是size_t,无符号整型
  • 传给strlen的参数指向的字符串必须以’\0’结尾
  • strlen是从传过来的参数地址开始计数,直到遇到’\0’结束

在这里插入图片描述


在这里插入图片描述

3.2 strlen函数的模拟实现

//strlen函数的模拟实现
//方法1:计数器
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* p)
{
	int count = 0;
    assert(p != NULL);
	while (*p != '\0')
	{
		count++;
		p++;
	}
	return count;
}
int main()
{
	const char* str = "abcde";
	size_t sum = my_strlen(str);
	printf("%zd\n", sum);
	return 0;
}

//方法2:指针-指针
//用指向起始位置地址的指针-指向‘\0’地址的指针
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* p)
{
 
	char* s = p;
  assert(p);
  assert(s);
	while (*p)
	{
		p++;
	}
	return p - s;
}
int main()
{
	const char* str = "abcde";
	size_t sum = my_strlen(str);
	printf("%zd\n", sum);
	return 0;
}

在这里插入图片描述


//方法3:函数递归
#include <stdio.h>
#include <assert.h>
size_t my_strlen(const char* s)
{
	assert(s);
	if (*s == '\0')
		return 0;
	else
		return 1 + my_strlen(s + 1);
}

int main()
{
	const char* str = "abcde";
	size_t sum = my_strlen(str);
	printf("%zd\n", sum);
	return 0;
}

  关于第三种函数递归的方式实现strlen函数,可参考函数递归

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

4.1 strcpy函数的使用

  • 我们如果想将一个数组里的字符串复制到另一个数组里,下面这个代码可行吗?
#include <stdio.h>
int main()
{   
    char arr1[]="abcdef";
    char arr2[30]={0};
    arr2 = arr1;
    printf("%s\n",arr2);
    return 0;
}

在这里插入图片描述


  那么我问如何把arr1里面的字符串复制到arr2里呢?
  C语言定义了一个专门用来字符串复制的函数:strcpy函数

  • char* strcpy ( char* destination, const char* source );
  •   |             |             |
  •   |           目标空间         源头
  • 返回的是目标空间起始地址

在这里插入图片描述


在这里插入图片描述


  • strcpy函数就是将源头字符串复制到目标空间里去,同时也会把源头字符串末尾的’\0’复制过去

在这里插入图片描述


  • strcpy函数使用时,源字符串必须以’\0’结尾

在这里插入图片描述


在这里插入图片描述


  • 目标空间必须足够大,确保能存放源字符串
  • 目标空间必须可修改

在这里插入图片描述


4.2 strcpy函数的模拟实现


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


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

5.1 strcat函数的使用

  • char* strcat ( char* destination, const char* source );
  •   |             |             |
  •   |           目标空间         源头
  • 返回的是目标空间起始地址

  • strcat函数是用来将源头字符串追加到目标字符串后面
  • strcat函数使用时,源字符串也必须以’\0’结尾
  • 目标空间必须足够大,能够容纳追加后的字符串
  • 目标空间必须可修改

在这里插入图片描述


5.2 strcat函数的模拟实现


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


6. strcmp函数的使用和实现

6.1 strcmp函数的使用


在这里插入图片描述


在这里插入图片描述


6.2 strcmp函数的模拟实现

//模拟实现strcmp函数
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 != NULL);
	assert(str2 != NULL);
	while (*str1 != '\0')
	{
		if (*str1 < *str2)
			return -1;
		else if (*str1 > *str2)
			return 1;
		else
		{
			str1++;
			str2++;
		}
	}
	if (*str1 == *str2)
		return 0;
}
int main()
{
	char arr1[] = "aabcdef";
	char arr2[] = "aabcdefg";
	if (my_strcmp(arr1, arr2) > 0)
	{
		printf(">\n");
	}
	else if (strcmp(arr1, arr2) < 0)
	{
		printf("<\n");
	}
	else
		printf("=\n");

	return 0;
}

在这里插入图片描述


7. strncpy函数的使用


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


8. strncat函数的使用


在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


9. strncmp函数的使用


在这里插入图片描述


在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2172792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

manim页面中不规则分割整个人页面。

界面中的分割方式 在信息设计中&#xff0c;我们常常需要通过分割设计的方式来对信息进行分组&#xff0c;界面中的分割方式大致分为三种&#xff1a;卡片、线条、留白。 界面中的分割方式主要可以分为以下几种&#xff1a; 一、根据规则进行分割&#xff1a; 规则网格分割&…

Starrocks with 嵌套

在某些场景下需要进行 with 嵌套 需要以下进行处理&#xff0c;报如图错误 with abc as (select * from .. ) insert into xxx select * from abc尝试创建物化视图 CREATE MATERIALIZED VIEW IF NOT EXISTS ads_test.xxx_mv REFRESH DEFERRED MANUAL AS with abc as (select…

C#基于SkiaSharp实现印章管理(9)

将印章设计模块设计的印章保存为图片并集中存放在指定文件夹内。新建印章应用项目&#xff0c;主要实现对图片及PDF文件加盖印章功能。本文实现给图片加盖印章功能。   给图片加盖印章的逻辑比较简单&#xff0c;就是将印章图片绘制到图片指定位置&#xff0c;使用SKControl控…

如何选择数据库架构

选择合适的数据库架构是一个复杂的过程&#xff0c;它取决于多种因素&#xff0c;包括应用程序的需求、数据量的大小、并发访问量、数据一致性要求、预算以及技术团队的熟悉程度等。以下是一些关键的步骤和考虑因素&#xff0c;帮助你选择合适的数据库架构&#xff1a; 1. 分析…

JITWatch安装使用方法

JITWatch 版本1.4.2 JDK 版本 11以上 1.下载JITWatch&#xff1a; https://github.com/AdoptOpenJDK/jitwatch/releases/download/1.4.2/jitwatch-ui-1.4.2-shaded-win.jar 2.启动 bat脚本执行&#xff1a;通过启动jar包方式启动JITWatch echo off start cmd /c "ti…

人工智能 实验1 Python语法

我发现了有些人喜欢静静看博客不聊天呐&#xff0c; 但是ta会点赞。 这样的人呢帅气低调有内涵&#xff0c; 美丽大方很优雅。 说的就是你&#xff0c; 不用再怀疑哦 实验1 Python语言基础一 【实验目的】掌握Python及其集成开发环境的下载安装及其简单应用 【实验内容…

结合了LLM(大语言模型)的编辑器,不仅能理解人类语言,还能与用户互动,仿佛有了自己的思想。...

从前有一个神奇的编辑器王国&#xff0c;那里住着各种编辑器&#xff1a;开源的、AI代码编辑器、视频编辑器&#xff0c;还有专门处理邮件和音频的编辑器。一天&#xff0c;国王Markdown决定举办一场盛会&#xff0c;邀请所有编辑器展示各自的才华。 开源编辑器们自豪地展示了他…

解决hbase和hadoop的log4j依赖冲突的警告

一、运行hbase的发现依赖冲突的警告 这警告不影响使用 二、重命名log4j文件 进入HBase的lib包下&#xff0c;将HBase的log4j文件重命名&#xff0c;改成备份&#xff0c;这样再次运行hbase的时候&#xff0c;就没有依赖冲突了。 三、冲突成功解决

数据分析工具julius ai如何使用

什么是julius ai Julius AI 是一款强大的ai数据分析工具。用户可以使用excel、数据库、文本文件等多种格式的数据&#xff0c;Julius AI 会自动分析这些数据并提供详细的解释和可视化图表。官网显示它目前已经有三十万用户。它也支持手机版。 虽然openai也支持生成图表&#xf…

研究生如何利用ChatGPT帮助开展日常科研工作?

小白可做&#xff01;全自动AI影视解说一键成片剪辑工具https://docs.qq.com/doc/DYnl6d0FLdHp0V2ll 作为当代研究生&#xff0c;科研工作三部曲----读文献、开组会、数据分析。无论哪一个&#xff0c;都令研究生们倍感头疼&#xff0c;简直就是梦魇。每当看到导师发来的消息&a…

Redis的主要特点及运用场景

Redis的主要特点及运用场景 Redis&#xff08;Remote Dictionary Server&#xff09;是一个开源的高性能键值对&#xff08;key-value&#xff09;数据库。它支持多种类型的数据结构&#xff0c;如字符串&#xff08;strings&#xff09;、散列&#xff08;hashes&…

CS61b学习 part 2

cscircles.cemc.uwaterloo.ca/java_visualize/#modedisplay public class ClassNameHere {public static void main(String[] args) {Walrus a new Walrus(1000, 8.3);Walrus b;b a;/*由于缺少函数&#xff0c;导致两个对象指向的是同一份*/b.weight 5;System.out.println(…

通俗易懂的Latex使用步骤

目录 Latex的安装和基本框架 TeX Live和TeXstudio的安装 Latex基本框架 标题 目录 列表 字体设置 图片 单张图片 多张图片&#xff08;以两张图片为例&#xff09;&#xff1a; 多张图片&#xff08;以三张图片为例&#xff09;&#xff1a; 公式 公式复制神器: …

全网最适合入门的面向对象编程教程:53 Python字符串与序列化-字符串与字符编码

全网最适合入门的面向对象编程教程&#xff1a;53 Python 字符串与序列化-字符串与字符编码 摘要&#xff1a; 在 Python 中&#xff0c;字符串是文本的表示&#xff0c;默认使用 Unicode 编码&#xff0c;这允许你处理各种字符集&#xff0c;字符编码是将字符转换为字节的规则…

第五部分:3---信号的介绍、产生、保存、处理

目录 信号的概念&#xff1a; 异步的概念&#xff1a; 信号的3种处理方式&#xff1a; 修改2号信号为自定义信号处理&#xff1a; ​编辑 信号捕捉后恢复和信号的忽略&#xff1a; 信号的分类与编号&#xff1a; 特殊的信号&#xff1a; 进程信号表的继承&#xff1a;…

标准 I/O

标准 I/O 引言 I/O 是一切实现的基础&#xff0c;其分为标准 I/O 和文件 I/O。 文件 I/O 依赖操作系统&#xff0c;因系统的实现方式而定&#xff0c;对于程序员来说会造成很大困扰。如打开文件&#xff0c;Linux 系统调用为 open() 函数&#xff0c;而 Windows 的系统调用为…

在新ARM板上移植U-Boot和Linux指南

序言 从支持一个定制板子在U-Boot和Linux中的过程中得到经验以一个带有知名SoC&#xff08;i.MX6&#xff09;且IP已经得到支持的板子为例&#xff0c;这次讨论几乎不涉及编码技能&#xff0c;更多地聚焦在U-Boot部分 一般原则 如果您有您的BSP&#xff08;板级支持包&#…

推荐、nlp、算法题等相关复习(0922-0929)

1. 算法题&#xff1a;路径总和三 求一棵树中所有路径和为targetsum的值&#xff0c;其实有点像和为k的数组&#xff0c;用前缀和来做 先求出前缀和数组&#xff0c;再类似两数之和问题&#xff0c;每次插入一个数&#xff0c;如果target-当前数在哈希表里存在&#xff0c;更…

Vscode: reason: oom, code: -536870904

最近使用github+插件github copilot开发时遇到这个问题, 出现原因:在chat窗口输入了过大的内容。 现象是:每次打开vscode后正常,且打开其他文件夹,再打开chat窗口运行正常。但当再次打开原来的文件夹并打开chat窗口时,则出现此崩溃问题。 尝试以下办法: 1、将D盘虚拟…

Android——添加联系人

概述 第一步 往手机联系人应用中的raw_contacts表添加一条记录 raw_contacts表 ContentValues values new ContentValues();// 往 raw_contacts 添加联系人记录&#xff0c;并获取添加后的联系人编号Uri uri resolver.insert(ContactsContract.RawContacts.CONTENT_URI, …