C语言:字符函数 字符串函数 内存函数

C语言:字符函数 & 字符串函数 & 内存函数

    • 字符函数
      • 字符分类函数
      • 字符转换函数
        • tolower
        • toupper
    • 字符串函数
      • strlen
      • strcpy
      • strcat
      • strcmp
      • strstr
      • strtok
    • 内存函数
      • memcpy
      • memmove
      • memset
      • memcmp


字符函数

顾名思义,字符函数就是作用于字符的函数,而字符函数主要分为字符分类函数以及字符转换函数

字符分类函数

字符分类函数,用于判断一个字符是否属于某一个类

函数参数符合条件
isntrl任何字符
isspace空白字符,空格'',换页符'\f',换行符'\n',回车符'\r',制表符'\t',垂直制表符'\v'
isdigit十进制数字0 - 9
isxdigit十六进制数字,包括0 - 9a - fA - F
islower小写字母a - z
isupper大写字母A - Z
isalpha字母a - zA - Z
isalnum字母或数字,a - zA - Z0 - 9
ispunct标点符号,任何不属于字母或数字的可打印字符
isgraph任何图形字符
isprint任何可打印字符

对于以上函数,只要传入的字符符合要求,返回非0数字;否则返回0;


字符转换函数

tolower

将传入的大写字母变成小写字母

toupper

将传入的小写字母变成大写字母


字符串函数

strlen

strlen函数用于求出字符串的长度,其判定结束的标志为\0

大部分情况下,\0出现在字符串的结尾,但是如果\0出现在字符串的中间,那么我们就无法得到字符串的正确长度。


strcpy

在这里插入图片描述
strcpy函数用于拷贝字符串,其参数如下:

destination:拷贝后字符串存放的空间
source:字符串的来源

返回值为char*,指向拷贝后的destination,方便链式访问

  • 对于source来说,其结束的标志依然为'\0',其默认带有的'\0'也会被拷贝到指定字符串的末尾。

  • destination必须指向可以修改的空间,并且足以放置source的字符个数。

strncpy是一个与strcpy功能一致的函数,但是其可以限制拷贝字符的个数
对于strcpy,其拷贝字符的个数就是source'\0'之前字符个数。strncpy可以传入第三个参数,用于规定拷贝字符的个数。

示例:

char arr[100] = { 0 };
strncpy(arr, "hello", 3);

以上代码把"hello"的前三个字符”hel“拷贝进了arr中。

另外,如果字符串的长度不足n,那么少的位置会用\0补充


strcat

在这里插入图片描述
strcat函数用于对字符串进行追加,其会把source追加到destination的末尾。所以destinationsource都必须由\0结尾

示例:

char arr[100] = "hello";
strcat(arr, "world");

追加后,arr内部存储的就是helloworld了。

注意事项:

  • C语言标准没有要求此函数可以自追加,这取决于编译器的实现
  • destination必须是可以修改的

同样的,这个函数也有限制长度的版本strncat。第三个参数用于限定追加字符串的长度:当字符串长度超过n,则只追加n个字符;当字符串长度小于n,那么追加完这个字符串就不再追加


strcmp

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

  • str1大于str2,返回大于0的值
  • str1等于str2,返回0
  • str1小于str2,返回小于0的值

比较的是两个字符串的字典序,而非长度。

同样的,该函数存在一个限制长度的版本strncmp,比较两个字符串的前n个字符。


strstr

在这里插入图片描述
此函数用于进行字符串查找,即在str1中查找str2

如果找到了,返回str1中指向str2的指针
如果没找到,返回NULL


strtok

在这里插入图片描述
strtok函数用于对字符串进行分割,其有两个参数:

str:被分割的字符串
delimiters:分隔符组成的字符串

比如delimiters如果是“@#!”,那么这个字符串遇到#@!时就会将字符串进行分隔。

当在字符串中找到了对应的分隔符:

  1. 将这个分隔符改为\0
  2. 返回指向这个字符的指针

如果没找到字符,或者遇到末尾,此时返回NULL

另外地,strtok如果对str传入了NULL,下一次会从上一次更改的地方开始查找

示例:

char arr[100] = "hello!world?cs@dn";
const char* p = "!?@";for (char* r = strtok(arr, p); r != NULL; r = strtok(NULL, p))
{printf("%s\n", r);
}

以上代码中,第一次调用strtok传入了arr,后续都传入NULL,从而完成整个字符串的分隔:
输出结果:

hello
world
cs
dn

内存函数

C语言中的内存函数用于对内存进行操控,主要包括内存的拷贝,初始化,以及内存数据的比较。

memcpy

在这里插入图片描述

函数用于对内存进行拷贝,此函数包含三个参数:

destination:目的地,即拷贝后的数据存入的地方
source:源,即被拷贝的内存
num:字节数

示例:

int arr1[] = { 1,2,3,4,5 };
int arr2[5] = { 0 };memcpy(arr2, arr1, sizeof(int) * 5);

以上代码,完成了两个数组之间的内存拷贝,拷贝方向为:从arr1拷贝到arr2,共拷贝了sizeof(int) * 5 = 20个字节。

现在我们模拟实现一个memecpy

void* my_memcpy(void* destination, void* source, size_t num)
{void* ret = destination;assert(destination && source);while (num--){*(char*)destination = *(char*)source;destination = (char*)destination + 1;source = (char*)source + 1;}return ret;
}

可以看到,memcpy的拷贝是以字节为单位,将传入的void*指针转为char*指针,然后一个一个字节进行拷贝。这样这个函数就可以处理任何类型的内存拷贝。

但是这个函数存在一个问题,无法拷贝内存发生重叠的函数

看到以下过程:

int arr[6] = { 1,2,3,4 };memcpy(arr + 2, arr, sizeof(int) * 4 ;

此代码希望把arr的前四个元素拷贝到后四位去,即:

1 2 1 2 3 4

实际输出结果:

1 2 1 2 1 2

为什么会这样?

看到以下过程:
在这里插入图片描述
我们要把蓝色区域的数值拷贝到红色区域,从左往右拷贝,第一次进行拷贝,由于内存重叠,1 2会把3 4覆盖,导致后续拷贝3 4时拷贝到的还是1 2

C语言标准库没有要求memcpy对重叠的内存进行处理,但是有的编译器可以处理这种情况,有的不可以。
为处理这个情况,C语言有专门的函数memmove用于处理重叠内存的情况。


memmove

memmove函数也用于进行内存拷贝,与memcpy不同的是,C标准规定其可以处理内存的重叠。

示例:

int arr[6] = { 1,2,3,4 };memmove(arr + 2, arr, sizeof(int) * 4 ;

同样的代码,输出结果为:

1 2 1 2 3 4

这是如何做到的?
其实就是一个简单的拷贝方向的问题:

当我们把以上的重叠拷贝,从右向左拷贝:
在这里插入图片描述
可以看到,虽然发生了内存的重叠,但是我们先把会被覆盖的数据拷贝好,然后再覆盖重叠区域的数据,此时我们的拷贝就正常运行了。

所以memmove的实现中,我们要根据内存的重叠情况,来控制内存的拷贝方向,以保证重叠的数据先被拷贝。

代码如下:

void* my_memmove(void* destination, void* source, size_t num)
{void* ret = destination;assert(destination && source);if (destination < source){while (num--){*(char*)destination = *(char*)source;destination = (char*)destination + 1;source = (char*)source + 1;}}else{while (num--){*((char*)destination + num) = *((char*)source + num);}}return ret;
}

destination指针小于source,我们就从低地址向高地址拷贝
destination指针大于source,我们就从高地址向低地址拷贝


memset

在这里插入图片描述
memset函数用于对内存进行初始化,其包含三个参数:

ptr:指向待初始化内存的指针
value:希望内存被初始化的值
num:想要初始化内存的字节数

此函数只能按照字节初始化内存,比如以下代码:

int arr[5] = { 0 };
memset(arr, 1, sizeof(int) * 5);

以上代码并不是把数组中的五个int元素初始化为1,而是把每个字节都初始化为00000001


memcmp

在这里插入图片描述
此函数用于比较内存中的数据,ptr1ptr2是被比较的内存。
其按照字节进行比较,从前往后,一个一个字节比较ASCII码值,当某一对字节的ASCII码值不同,此时该字节ASCII码值大的内存,就是比较大的。


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

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

相关文章

uniapp中获取位置信息处理

在微信小程序中&#xff0c;获取定位&#xff0c;是需要用户授权的&#xff0c;那么当用户拒绝授权后&#xff0c;需要重新获取定位时&#xff0c;是不会再调起授权界面&#xff0c;这时需要用户主动打开设置界面&#xff0c;才可以重新开启授权权限&#xff1b; 那么&#xf…

【MySQL | 第一篇】undo log、redo log、bin log三者之间的区分?

undo log、redo log、bin log三者之间的区分&#xff1f; 从 产生的时间点、日志内容、用途 三方面展开论述即可 1.undo log——撤销日志 时间点&#xff1a;事务开始之前产生&#xff0c;根据当前版本的数据生成一个undo log&#xff0c;也保存在事务开始之前 作用&#xf…

PHP学习笔记2——前后端,mysql增删改查

php是一种适用于后端与前端的编程语言 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>index</t…

【亚马逊云新春特辑②】构生成式 AI 文生图工具之借助ControlNet进行AI绘画创作【生成艺术二维码】

文章目录 1.1 生成艺术二维码1&#xff09;制作基础二维码2&#xff09;确定艺术风格3&#xff09;生成艺术二维码4&#xff09;结果优化 AIGC 的可控性是它进入实际生产最关键的一环。在此之前&#xff0c;许多用户希望 AI 生成的结果尽可能符合要求&#xff0c;但都不尽如人意…

961. 最大获利(网络流,最小割,最大权闭合图)

活动 - AcWing 新的技术正冲击着手机通讯市场&#xff0c;对于各大运营商来说&#xff0c;这既是机遇&#xff0c;更是挑战。 THU 集团旗下的 CS&T 通讯公司在新一代通讯技术血战的前夜&#xff0c;需要做太多的准备工作&#xff0c;仅就站址选择一项&#xff0c;就需要完…

linux centos7.9改dns和ip

vi /etc/sysconfig/network-scripts/ifcfg-ens32 &#xff1a;wq后 重启网络服务 systemctl restart network —————————————————————————— 篇外话题 软件下载 xshell可以从腾讯软件中心下载

基于Rust语言,和WebAssembly技术,与JavaScript结合,的具体应用场景

基于Rust语言与WebAssembly&#xff08;Wasm&#xff09;技术并与JavaScript结合&#xff0c;可以应用于多个场景&#xff0c;特别是在需要高性能和/或低级系统访问的情况下。下面是一些具体的应用场景&#xff1a; 性能密集型任务: Rust加上Wasm适合执行计算密集型任务&#x…

笔记电商人工智能客服

天猫-店小蜜 标准模式 全自动接待&#xff1a;机器接待。若答不出&#xff0c;转人工引导语&#xff0c;顾客手动转人工。 智能辅助接待&#xff1a;机器人将辅助客服接待&#xff0c;在客服接待过程中提供话术推荐&#xff0c;并自动回复客服尚未接起的买家咨询。 混合接待…

在达梦DM8数据库的运行日志中出现大量 Failure occurs in data_recv_inet_once 警告信息

【问题描述】&#xff1a; 在 DM 达梦数据库的运行日志中出现大量 Failure occurs in data_recv_inet_once 警告信息&#xff0c;如下图&#xff1a; [WARNING] database P0000005986 T0000000000000022168 Failure occurs in data_recv_inet_once, code(13) len(32576, 0) [W…

使用 C++23 协程实现第一个 co_yield 同步风格调用接口--Qt计算排列组合

上一篇介绍了 co_await 的例子。与 co_await 类似&#xff0c;在C23的协程特性里&#xff0c; co_yield 用于从协程执行过程中暂停&#xff0c;并返回值。这个功能乍一听起来很奇怪&#xff0c;网上的例子大多是用一个计数器来演示多次中断协程函数&#xff0c;返回顺序的计数值…

【MySQL】DCL

DCL英文全称是Data Control Language(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访问权限。 1. 管理用户 在MySQL数据库中&#xff0c;DCL&#xff08;数据控制语言&#xff09;是用来管理用户和权限的语句集合。通过DCL语句&#xff0c;可以创建、修改、删…

机器遗忘同等重要,AI如何忘记不良数据,保护用户隐私?

引言&#xff1a;大语言模型中的机器遗忘问题 在人工智能领域&#xff0c;大语言模型&#xff08;LLMs&#xff09;因其在文本生成、摘要、问答等任务中展现出的卓越能力而备受关注。然而&#xff0c;这些模型在训练过程中可能会记住大量数据&#xff0c;包括敏感或不当的信息…

数据分析(二):学生成绩预测分析报告

目录 摘要 一、引言 二、 数据源介绍 三、 数据清洗和预处理 3.1 缺失值处理 3.2 异常值处理 3.3 数据编码 四、 探索性数据分析 4.1 可视化相关统计量 4.2 目标数据的分布情况 4.3 Pearson 相关性分析 五、 特征工程 5.1 特征构造 5.1.1 总饮酒量 5.1.2 整体关…

使用空闲电脑免费搭建一个私人的网盘

如果你也有一台空闲电脑&#xff0c;可以使用它来搭建一个私人的网盘。 这里使用的是飞梦云网盘&#xff1b; 服务端&#xff1a;下载 服务器文件使用hash校验进行储存&#xff0c;实现重复上传的文件秒传功能。 Fuse4Ui&#xff08;虚拟分区工具&#xff09;&#xff1a;下…

GaN建模:强大但富有挑战性

来源&#xff1a;Modeling GaN: Powerful but Challenging&#xff08;10年&#xff09; 文章的研究内容 这篇文章主要研究了氮化镓&#xff08;GaN&#xff09;高电子迁移率晶体管&#xff08;HEMTs&#xff09;的建模问题。GaN HEMTs是微波频段高功率发射器设计中的关键技术…

java面试题基础篇,kafka与rabbitmq面试题

1. Java 堆空间 **发生频率&#xff1a;**5颗星 造成原因 无法在 Java 堆中分配对象 吞吐量增加 应用程序无意中保存了对象引用&#xff0c;对象无法被 GC 回收 应用程序过度使用 finalizer。finalizer 对象不能被 GC 立刻回收。finalizer 由结束队列服务的守护线程调用&a…

C语言操作符优先顺序

以下是 C 语言中各种运算符的优先级&#xff0c;按照优先级从高到低的顺序列出&#xff1a; () : 圆括号&#xff0c;函数调用&#xff0c;强制类型转换[] : 数组下标-> : 结构体和共用体成员通过指针访问. : 结构体和共用体成员访问 -- : 自增、自减 - : 正、负号! ~ : 逻…

K8S常见的持久化(存储)方案用法详解

文章目录 1、k8s持久化存储&#xff1a;emptyDir 临时存储方案2、k8s持久化存储&#xff1a;hostPath3、k8s持久化存储&#xff1a;nfs1、搭建nfs服务2.创建Pod&#xff0c;挂载NFS共享出来的目录3.请求pod&#xff0c;看结果 4、k8s持久化存储&#xff1a; PVC4.1.1 k8s PV是什…

BOOT电路

本质&#xff1a;BOOT电路本质上是单片机的引脚 作用&#xff1a;BOOT电路的作用是用于确定单片机的启动模式 使用方法&#xff1a;在单片机上电或者复位时给BOOT管脚设置为指定电平即可将单片机设置为指定启动模式。 原理&#xff1a;单片机上电或复位后会先启动内部晶振&a…

【C++进阶】哈希 + unordered系列容器

&#x1f466;个人主页&#xff1a;Weraphael ✍&#x1f3fb;作者简介&#xff1a;目前学习C和算法 ✈️专栏&#xff1a;C航路 &#x1f40b; 希望大家多多支持&#xff0c;咱一起进步&#xff01;&#x1f601; 如果文章对你有帮助的话 欢迎 评论&#x1f4ac; 点赞&#x1…