C语言进阶【1】--字符函数和字符串函数【1】

news2024/11/24 11:50:39

本章概述

  • 字符分类函数
  • 字符转换函数
  • strlen的使用和模拟实现
  • strcpy的使用和模拟实现
  • strcat的使用和模拟实现
  • strcmp的使用和模拟实现
  • 彩蛋时刻!!!

字符分类函数

  • 字符: 这个概念,我们在以前的文章中讲过了。我们键盘输入的信息都是字符。字符大体可以分为两类——单个字符字符串。而单个字符又可以进行分类——字母字符数字字符特殊字符不可见字符。进行思维图展示:在这里插入图片描述
    在日常生活中,我们写的字符也就是随便写,比如,123,abc……。但在C语言中为了识别出字符和字符串,我们就要用两个操作符——' '" "' '用来识别单个字符的," "用来识别字符串的。
    我们对于所写的字符,我们人都能识别出来。A我们能识别它是大写,a我们能识别它是小写,1我们能识别它是数字。但是,计算机是无法识别出来的,所以,为了能够让计算机识别,我们就创建了字符分类函数。我们进行展示:在这里插入图片描述
    它们的头文件是:<ctype.h>,当条件为真时,就会返回大于0的数值,反之返回小于0的数值。这些字符分类函数的用法都是相同,所以我们举一个就行了(常用的),比如,islower判断是否小写的函数。我们先来看它的类型和参数:
//	int islower (int c)

进行代码展示:

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <ctype.h>
int main()
{
	int c = islower('a');
	int b = islower('A');
	if (c > 0)
		printf("%c是小写\n", 'a');
	else
		printf("%c是大写\n", 'a');

	if (b > 0)
		printf("%c是小写\n", 'A');
	else
		printf("%c是大写\n", 'A');
	return 0;
}

结果运行图:在这里插入图片描述
对于其它字符分类函数的使用,大家可以点击连接进行学习使用:https://cplusplus.com/reference/clibrary/

字符转换函数

C语言中就俩字符转换函数,它们的头文件是 <ctype.h>,如下:

//	大写转小写:int  tolower (int c)
//	小写转大写:int  toupper  (int c)

进行代码展示:

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main()
{
	int c = toupper('a');	//转大写
	printf("%c\n", c);
	int b = tolower('A');	//转小写
	printf("%c\n", b);
	return 0;
}

结果运行图:在这里插入图片描述
我们来写个程序,运用我们所学的知识:

//	我们写一句英文,然后,把我们所写的英文全部转换为大写,比如:
//	I am a student.-------> I AM A STUDENT.
//	我们来写两个方法进行实现。

程序【1】

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main()
{
	char arr[] = "I am a student.";
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	printf("转换前:%s\n", arr);

	for (i = 0; i < sz; i++)
	{
		if (islower(arr[i]))
			arr[i] = arr[i] - 32;	//大写字母的AS||值比小写字母的AS||值少32
	}
	printf("转换后:%s\n",arr);

	return 0;
}

结果运行图:在这里插入图片描述
程序【2】。

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <ctype.h>
int main()
{
	char arr[] = "I am a student.";
	int sz = sizeof(arr) / sizeof(arr[0]);
	int i = 0;
	printf("转换前:%s\n", arr);
	for (i = 0; i < sz; i++)
	{
		if(islower(arr[i]))
			arr[i]=toupper(arr[i]);	//使用 toupper进行转换
	}
	printf("转换后:%s\n",arr);

	return 0;
}

结果运行图:在这里插入图片描述
大家也可以进行举一反三,比如,大写转小写代码。

strlen的使用和模拟实现

  • strlen的使用:后面,我们要开始讲字符串相关的函数了,它们的头文件<string.h>。前面,咱们已经讲过了strlen的使用和模拟实现,今天在复习一下。我们知道,每个字符串后面都会自动补\0,strlen统计的是\0之前的字符串的长度。进行代码展示:
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "abcdef";
	printf("%zd", strlen(arr));
	return 0;
}

结果运行图:在这里插入图片描述
对于strlen的返回值打印最好要用%zd。因为strlen返回值类型为size_t(无符号整形),关于为什么是size_t的类型,咱们在以前的文章中讲过了。
我们还可以指定它的统计起始位置,进行代码展示:下面展示一些 内联代码片

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "abcdef";
	printf("%zd", strlen(arr+1));	//从b开始进行统计,所以统计数为:5.
	return 0;
}

结果运行图展示:在这里插入图片描述

  • strlen的模拟:
//	咱们写三种方法进行实现。
// 	思路:统计\0之前的字符数。

方法【1】----计数器的方式

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
size_t my_strlen(char arr[])
{
	int count = 0;
	int i = 0;
	while (arr[i])
	{
		count++;
		i++;
	}
	return count;
}
int main()
{
	char arr[] = "abcdef";
	printf("%zd\n", my_strlen(arr));
	return 0;
}

结果运行图:在这里插入图片描述
方法【2】----指针-指针

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
size_t my_strlen(char arr[])
{
	char*s1=arr;
	while (*arr)
	{
		arr++;
	}
	return arr-s1;
}
int main()
{
	char arr[] = "abcdef";
	printf("%zd\n", my_strlen(arr));
	return 0;
}

结果运行图:在这里插入图片描述
方法【3】----递归函数
进行如图所示的逻辑:

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
size_t my_strlen(char arr[])
{
	if (*arr)
	{
		arr++;
		return 1 + my_strlen(arr);
	}
	else
		return 0;
	 
}
int main()
{
	char arr[] = "abcdef";
	printf("%zd\n", my_strlen(arr));
	return 0;
}

结果运行图:在这里插入图片描述
在这三种方法都很好,都是使用了我们所学过的知识,大家要掌握。

strcpy的使用和模拟实现

  • strcpy的使用: 具有拷贝字符串的功能。比如,A字符串拷向B字符串,B字符串拷向A字符串,自己向自己拷贝。 我们来看它的结构组成:
//		char * strncpy ( char * destination, const char * source );
		 |								|					|
		 |								|					|
		 |								|					|
返回的是des的地址(未更改前的)	     目的地的地址	       拷贝源的地址
	
//		因为我们不想拷贝来源的时候,发生更改,所以用const修饰。
  • 它的使用有几个要注意的点
    • 1.拷贝的来源必须以' \0'结尾
    • 2.dest的空间要足够大,要容的下要拷贝的内容。
    • 3.des的空间是要可修改的,要不然就无法拷贝。
    • 4 .拷贝的时候,也会把source的' \0'拷贝过去
    • 5.拷贝的起始位置是可以指定的(des和source都可以指定起始位置,指定的方式和strlen一样)
  • 进行代码展示:
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
int main()
{
	char arr[] = "abcedf";
	char arr1[30]={0};
	printf("拷贝前arr1:%s\n",arr1);
	printf("拷贝后arr1:%s\n", strcpy(arr1, arr));
	return 0;
}

结果运行图:

  • strcpy的模拟实现:
//		遇到source的' \0'就会拷贝停止,但也要把' \0'拷贝过去

进行代码展示:

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcpy(char* des, const char* str)
{
	char* p = des;			//因为经过后面的程序后,des的值早变了,所以要先给cpy一份
	assert(des && str);		//判断一下,des和str是否为空指针
	while (*des++=*str++)
	{
		;
	}
	return p;
}
int main()
{
	char arr[] = "abcedf";
	char arr1[30] = {0};
	printf("拷贝前arr1:%s\n",arr1);
	printf("拷贝后arr1:%s\n", my_strcpy(arr1, arr));

	return 0;
}

结果运行图:在这里插入图片描述

strcat的使用和模拟实现

  • strcat的使用它具有在字符串的后面补上别的字符串的功能。比如:
// char arr[30]="abd" ;
// char arr1[4]="acd" ;
//  arr1向arr的末尾补齐------->"abdacd"
  • 它的结构所示:
//  char * strcat(char *dest, const char*src)
//		返回值和每个参数的意思和strcpy是一样的
  • 它的使用要注意的点
    • 1.src会找到des的第一个出现的' \0',在此处把src的字符串补充到des中(此时的’ \0’会被覆盖)。
    • 2 .由于des的’ \0’被覆盖了,所以str在补充字符串后,会在末尾添加’\0’。占别人的东西,最后肯定要还的!
    • 3.des的空间要够大,要容得下补充后的字符空间。
    • 4 .补充的起始位置是可以指定的(des和str都可以指定起始位置,指定的方式和strlen一样)
  • 进行代码展示:
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main()
{
	char arr[30] ="abcdef";
	char arr1[] = "xxx";
	printf("%s\n", strcat(arr, arr1));
	return 0;
}

结果运行图:在这里插入图片描述

  • strcat的模拟实现思路我们要找到des的’\0’, 才能进行补充。进行代码展示:
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
#include <assert.h>
char* my_strcat(char* des, const char* str)
{
	char* p = des;
	assert(des && str);
	while (*des)
		des++;
	while (*des++=*str++)
	{
		;
	}
	return p;
}
int main()
{
	char arr[30] ="abcdef";
	char arr1[] = "xxx";
	printf("%s\n", my_strcat(arr, arr1));
	return 0;
}

结果运行图:在这里插入图片描述

strcmp的使用和模拟实现

  • strcmp的使用:是用来比较字符串的大小的。它比较的可不是两个字符串的长度大小比较的是每单个字符的大小(就是比较两个单个字符的AS||值的大小)。结构组成如下:
//		int strcmp (const char * str1, const char * str2)
  • 要注意的几点:
    • 1.比较的顺序就是所输入的数据,比如,输入顺序:str1 ,str2。 比较顺序:str1 ,str2。 输入顺序:str2 ,str1。 比较顺序:str2 ,str1。
    • 2 .str1 > str2就会返回大于0的数值。str1<str2就会返回小于0的值。str1=str2就会返回0
    • 3.因为我们要比较两个字符串的大小,所比较的内容不能被更改,所以参数要用const修饰。
    • 4 .比较的起始位置是可以指定的(str1和str2都可以指定起始位置,指定的方式和strlen一样)
  • 进行代码展示:
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <string.h>
#include <assert.h>
int main()
{
	char arr[30] ="abcdef";
	char arr1[] = "abx";
	printf("%d\n", strcmp(arr, arr1));
	return 0;
}

结果运行图:在这里插入图片描述
大家可自行试一下,对于和等于的代码。

  • strcmp的模拟实现比较的AS||值的大小,进行代码展示:
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <assert.h>
#include <string.h>
int my_strcmp(const char* e1, const char* e2)
{
	while (*e1 == *e2)
	{
		e1++;
		e2++;
		if (*e1 == '\0' || *e2 == '\0')
			break;
	}
	return *(int*)e1 - *(int*)e2;
}
int main()
{
	char arr[30] = "abcdef";
	char arr1[] = "abx";
	printf("%d\n", my_strcmp(arr, arr1));
	return 0;
}

结果运行图:在这里插入图片描述

彩蛋时刻!!!

https://www.bilibili.com/video/BV1Ze4y1F7CV/?spm_id_from=333.337.search-card.all.click
在这里插入图片描述每章一句总有人翘首以盼为你而来。感谢你能看到这里,点赞+关注+收藏+转发是对我最大的鼓励,咱们下期间!!!

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

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

相关文章

通信工程学习:什么是MPC多媒体个人计算机、MCS多媒体计算机系统

一、MPC多媒体个人计算机&#xff08;Multimedia Personal Computer&#xff09; 1、MPC多媒体个人计算机定义 多媒体个人计算机&#xff08;MPC&#xff09;是指具备处理多媒体信息&#xff08;如音频、视频、图像、动画和文本等&#xff09;能力的个人计算机。它不仅具备传统…

html记账本改写:保存数据 localStorage。

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>记账本改写</title><style>table {user-select: none;/* width: 100%; */border-collapse: collapse;}table,th,td {border: 1px solid…

数据集 3DPW-开源户外三维人体建模-姿态估计-人体关键点-人体mesh建模 >> DataBall

3DPW 3DPW-开源户外三维人体建模数据集-姿态估计-人体关键点-人体mesh建模 开源户外三维人体数据集 inproceedings{vonMarcard2018, title {Recovering Accurate 3D Human Pose in The Wild Using IMUs and a Moving Camera}, author {von Marcard, Timo and Henschel, Robe…

从“游戏科学”到玄机科技:《黑神话:悟空》的视角打开动漫宇宙

近日&#xff0c;中国游戏界迎来了一场前所未有的盛事——由游戏科学公司开发的《黑神话&#xff1a;悟空》正式上线&#xff0c;并迅速成为全球玩家热议的焦点。在居高不下的讨论热度中&#xff0c;有人说他的成功在于对《西游记》为背景进行改编&#xff0c;对原著进行了分析…

读软件设计的要素04概念的关系

1. 概念的关系 1.1. 概念是独立的&#xff0c;彼此间无须相互依赖 1.1.1. 一个概念是应该独立地被理解、设计和实现的 1.1.2. 独立性是概念的简单性和可重用性的关键 1.2. 软件存在依赖性 1.2.1. 不是说一个概念需要依赖另一个概念才能正确运行 1.2.2. 只有当一个概念存在…

1 模拟——67. 二进制求和

1 模拟 67. 二进制求和 给你两个二进制字符串 a 和 b &#xff0c;以二进制字符串的形式返回它们的和。 示例 1&#xff1a; 输入:a "11", b "1" 输出&#xff1a;"100" 示例 2&#xff1a; 输入&#xff1a;a "1010", b "…

单GPU一分钟生成16K高清图像!新加坡国立发布LinFusion:无缝兼容Stable Diffusion插件

论文链接&#xff1a;https://arxiv.org/pdf/2409.02097 Git链接&#xff1a;https://lv-linfusion.github.io/ 亮点直击 本文研究了Mamba的非因果和归一化感知版本&#xff0c;并提出了一种新颖的线性注意力机制&#xff0c;解决了扩散模型在高分辨率视觉生成中的挑战。 本文…

Vue——day11之生命周期

目录 生命周期的八个阶段 生命周期执行的流程图 代码示例 总结 Vue的生命周期是指在Vue实例创建、挂载、更新和销毁过程中&#xff0c;会触发的一系列钩子函数。这些钩子函数可以用来在不同的生命周期阶段执行相应的逻辑操作。 生命周期的八个阶段 Vue的生命周期可以分为…

Github 2024-09-08 php开源项目日报 Top10

根据Github Trendings的统计,今日(2024-09-08统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量PHP项目10TypeScript项目1JavaScript项目1Laravel: 以优雅语法简化Web开发 创建周期:4028 天开发语言:PHP协议类型:MIT LicenseStar数量:30…

gazebo 已加载模型但无法显示

目录 写在前面的话问题一&#xff1a;robot_state_publisher 发布机器人信息失败报错一 Error: Error document empty.报错二 .xcaro 文件中有多行注释成功启动 问题二&#xff1a;通过 ros2 启动 gazebo 失败成功启动 问题三&#xff1a;gazebo 崩溃和无法显示模型问题四&…

使用LSTM(长短期记忆网络)模型预测股票价格的实例分析

一&#xff1a;LSTM与RNN的区别 LSTM&#xff08;Long Short-Term Memory&#xff09;是一种特殊的循环神经网络&#xff08;RNN&#xff09;架构。LSTM是为了解决传统RNN在处理长序列数据时遇到的梯度消失或梯度爆炸问题而设计的。 在传统的RNN中&#xff0c;信息通过隐藏状…

电动机制造5G智能工厂工业物联数字孪生平台,推进制造业数字化转型

电动机制造5G智能工厂工业物联数字孪生平台&#xff0c;推进制造业数字化转型。5G智能工厂与物联数字孪生平台的融合应用&#xff0c;为电动机制造业的数字化转型铺设了一条高速通道。这一创新模式不仅极大地提升了生产效率&#xff0c;还深刻改变了产品的设计、生产、管理及运…

在全球化时代成为超级个体:Web3、个人品牌与AI工具的融合

随着Web3技术和人工智能的快速发展,个人品牌建设与创作者经济正在迎来前所未有的机遇。《Web3Brand》是一个专注于帮助用户理解Web3技术、建立和增强个人品牌、提升创作者经济实力,并利用AI工具提高工作效率的平台。本文将探讨该博客如何通过提供播客、案例分析、策略指南和工…

redis内存清理和linux系统清理缓存以及redis启动

1清空所有数据库 redis-cli FLUSHALL 2清空所有数据库redis-cli FLUSHDB 3. 删除指定的缓存键 redis-cli DEL <key>4. 设置键过期 redis-cli EXPIRE <key> <seconds>例如&#xff1a; redis-cli EXPIRE mykey 605.启动redis 这个启动命令要在/usr/loca…

sql 中名字 不可以 包含 mysql中 具有 特定意义 的单词

这种sql执行不报错 这种sql执行报错 所以sql中名字不可以使用mysql中具有特定意义的单词 以此文章作为警告&#xff0c;我下次起名字不可以使用 mysql中具有特殊意义的字符 就因为这个导致我搞了一个多小时&#xff0c;急死我了&#xff0c;周五就要前后端联调了。下次千万不…

NSmartProxy:一款.NET开源、跨平台的内网穿透工具

前言 今天大姚给大家分享一款.NET开源、免费&#xff08;MIT License&#xff09;、跨平台的内网穿透工具&#xff0c;采用.NET Core的全异步模式打造&#xff1a;NSmartProxy。 内网穿透工具介绍 内网穿透工具是一种能够允许用户从互联网上的任何地方安全地访问并管理处于内…

代码随想录训练营day37|52. 携带研究材料,518.零钱兑换II,377. 组合总和 Ⅳ,70. 爬楼梯

52. 携带研究材料 这是一个完全背包问题&#xff0c;就是每个物品可以无限放。 在一维滚动数组的时候规定了遍历顺序是要从后往前的&#xff0c;就是因为不能多次放物体。 所以这里能多次放物体只需要把遍历顺序改改就好了 # include<iostream> # include<vector>…

数据结构:线性表的顺序存储

文章目录 &#x1f34a;自我介绍&#x1f34a;线性表的顺序存储介绍概述例子 &#x1f34a;顺序表的存储类型设计设计思路类型设计 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以&#xff1a;点赞关注评论收藏&#xff08;一键四连&#xff09;哦~ &#x1f34a;自我…

Temu官方宣导务必将所有的点位材料进行检测-RSL资质检测

关于饰品类产品合规问题宣导&#xff1a; 产品法规RSL要求 RSL测试是根据REACH法规及附录17的要求进行测试。REACH法规是欧洲一项重要的法规&#xff0c;其中包含许多对化学物质进行限制的规定和高度关注物质。 为了确保珠宝首饰的安全性&#xff0c;欧盟REACH法规规定&#…

【H2O2|全栈】关于HTML(2)HTML基础(一)

HTML相关知识 目录 前言 准备工作 标签的具体分类&#xff08;一&#xff09; 本文中的标签在什么位置使用&#xff1f; 属性 标题标签 段落标签 文本格式化标签 分类汇总 计算机输出标签 ​编辑分类汇总 引文&#xff0c;引用标签 分类汇总 预告和回顾 UI设计…