当前位置: 首页 > news >正文

C语言学习系列-->字符函数和字符串函数

在这里插入图片描述

文章目录

  • 一、字符函数
    • 1、字符分类函数
    • 2、字符转换函数
  • 二、字符串函数
    • 1、strlen
      • 概述
      • 模拟实现
    • 2、strcpy
      • 概述
      • 模拟实现
    • 3、strcat
      • 概述
      • 模拟实现
    • 3、strcmp
      • 概述
      • 模拟实现
    • 4、有限制的字符串函数
      • strncpy
      • strncat
      • strncmp
    • 4、strstr
      • 概述
      • 模拟实现

一、字符函数

1、字符分类函数

包含头文件:

#include<ctype.h>
函数如果它的参数复合下列条件就返回真(一个非零数字)
iscntrl任何控制字符
任何控制字符空白字符:空格’ ‘,换页’\f’,换行’\n’,回车’\r’,制表符’\t’或者垂直制表符’\v’
isdigit十进制数字0~9
isxdigit十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A-F
islower小写字母a~z
isupper大写字母A~Z
isalpha字母a~z或A-Z
isalnum字母或者数字,a-z,A-Z ,0~9
ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符

这些字符函数都很类似,举一个例子

将小写字母转换成大写字母

#include<stdio.h>
#include<ctype.h>int main()
{char str[] = "Test String";char c;int i = 0;while (str[i]){c = str[i];if (islower(c))c = c - 32;putchar(c);i++;}return 0;
}

运行结果

TEST STRING.

2、字符转换函数

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

我们知道,将小写字母转换成大写是-32,大写字母转换成小写字母是+32

那么,现在有了字符转换函数,就可以直接实现

#include <stdio.h>
#include <ctype.h>
int main()
{int i = 0;char str[] = "Test String.\n";char c;while (str[i]){c = str[i];if (islower(c))c = toupper(c);putchar(c);i++;}return 0;
}

运行结果

TEST STRING.

二、字符串函数

1、strlen

概述

size_t strlen ( const char * str );

• 字符串以 ‘\0’ 作为结束标志,strlen函数返回的是在字符串中 ‘\0’ 前⾯出现的字符个数(不包含 ‘\0’ )。
• 参数指向的字符串必须要以 ‘\0’ 结束。
• 注意函数的返回值为size_t,是⽆符号的( 易错 )
• 学会strlen函数的模拟实现

模拟实现

法1:

#include<stdio.h>
#include<string.h>
#include<assert.h>size_t my_strlen(const char* str)
{int count = 0;assert(str);while (*str){count++;str++;}return count;
}int main()
{char arr[] = "abc";size_t len = my_strlen(arr);printf("%zd\n", len);return 0;
}

法2:

#include<stdio.h>
#include<string.h>
#include<assert.h>size_t my_strlen(const char* str)
{assert(str);if (*str == '\0')return 0;elsereturn 1 + my_strlen(str + 1);
}int main()
{char arr[] = "abc";size_t len = my_strlen(arr);printf("%zd\n", len);return 0;
}

法3:

#include<stdio.h>
#include<string.h>
#include<assert.h>size_t my_strlen(char* s)
{char* p = s;while (*p)p++;return p - s;
}int main()
{char arr[] = "abc";size_t len = my_strlen(arr);printf("%zd\n", len);return 0;
}

2、strcpy

概述

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

• 源字符串必须以 ‘\0’ 结束。
• 会将源字符串中的 ‘\0’ 拷⻉到⽬标空间。
• ⽬标空间必须⾜够⼤,以确保能存放源字符串。
• ⽬标空间必须可变。
• 学会模拟实现。

模拟实现

char my_strcpy(char* dest, const char* src)
{char* ret = dest;assert(dest);assert(src);while (*dest++ = *src++){;}return ret;
}

3、strcat

概述

• 源字符串必须以 ‘\0’ 结束。
• ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
• ⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
• ⽬标空间必须可修改。

模拟实现

char my_strcat(char* dest, const char* src)
{char* ret = *src;assert(dest);assert(src);while (*dest){dest++;}while (*dest++ = *src){;}return ret;
}

3、strcmp

概述

标准规定:
◦ 第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字
◦ 第⼀个字符串等于第⼆个字符串,则返回0
◦ 第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字

模拟实现

int my_strcmp(const char* arr1, const char* arr2)
{assert(arr1);assert(arr2);while (*arr1 == *arr2){if (*arr1 == '\0')return 0;arr1++;arr2++;}return *arr1 - *arr2;
}

4、有限制的字符串函数

前面1-3学习字符串函数,但是那些字符串函数没有个数限制,不安全

下面小编带大家了解一下有个数限制的字符串函数

strncpy

char * strncpy ( char * destination, const char * source, size_t num );

• 拷⻉num个字符从源字符串到⽬标空间。

• 如果源字符串的⻓度⼩于num,则拷⻉完源字符串之后,在⽬标的后边追加0,直到num个。

strncat

char * strncat ( char * destination, const char * source, size_t num );
#include <stdio.h>
#include <string.h>
int main()
{char str1[20];char str2[20];strcpy(str1, "To be ");strcpy(str2, "or not to be");strncat(str1, str2, 6);printf("%s\n", str1);return 0;
}

strncmp

int strncmp ( const char * str1, const char * str2, size_t num );

⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀
样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0.

4、strstr

概述

char * strstr ( const char *, const char * );

在字符串中找一个子字符串

返回str2在str1中第一次出现的位置
如果str2在str1中没有出现,就返回NULL

模拟实现

#include<stdio.h>
#include<string.h>
#include<assert.h>const char* my_strstr(const char* str1, const char * str2)
{assert(str1);assert(str2);const char* cp = str1;const char* s1 = NULL;const char* s2 = NULL;//如果子串是空字符串,直接返回str1if (*str2 == '\0')return str1;while (*cp){s1 = cp;s2 = str2;while (*s1 == *s2 && *s1 && *s2){s1++;s2++;}if (*s2 == '\0')return cp;cp++;}return NULL;
}int main()
{char arr1[] = "abbbcdef";char arr2[] = "bbc";char* ret = my_strstr(arr1, arr2);if (ret != NULL)printf("%s\n", ret);elseprintf("找不到\n");return 0;
}

图解:
在这里插入图片描述

在这里插入图片描述

相关文章:

C语言学习系列-->字符函数和字符串函数

文章目录 一、字符函数1、字符分类函数2、字符转换函数 二、字符串函数1、strlen概述模拟实现 2、strcpy概述模拟实现 3、strcat概述模拟实现 3、strcmp概述模拟实现 4、有限制的字符串函数strncpystrncatstrncmp 4、strstr概述模拟实现 一、字符函数 1、字符分类函数 包含头…...

尖端AR技术如何在美国革新外科手术实践?

AR智能眼镜已成为一种革新性的工具&#xff0c;在外科领域具有无穷的优势和无限的机遇。Vuzix与众多医疗创新企业建立了长期合作关系&#xff0c;如Pixee Medical、Medacta、Ohana One、Rods & Cones、Proximie等。这些公司一致认为Vuzix智能眼镜可有效提升手术实践&#x…...

【木板】Python实现-附ChatGPT解析

1.题目 木板 时间限制:1s 空间限制:256MB 限定语言:不限题目描述: 小明有n块木板,第i (1<=i<=n) 块木板的长度为ai.小明买了一块长度为m的木料,这块木料可以切割成任意块,拼接到已有的木板上用来加长木板。 小明想让最短的木板尽量长。 请问小明加长木板后,最短木板…...

第一章:绪论

1.1 系统架构概述 架构是体现在组件中的一个系统的基本组织、它们彼此的关系与环境的关系以及指导它的设计和发展的原则。 系统是组织起来完成某一特定功能火一组功能的组件集。系统这个术语包括了单独的应用程序、传统意义上的系统、子系统、系统之系统、产品线、整个企业及…...

C++面试知识点总结

知识点总结 <<符号表示该语句将把这个字符串发送给cout&#xff1b;该符号指出了信息流动的路径&#xff1b;cout的对象属性包括一个插入运算符&#xff08;<<&#xff09;&#xff0c;它可以将其右侧的信息插入到流中&#xff0c;endl:重起一行。在输出流中插入en…...

从智能手机到智能机器人:小米品牌的高端化之路

原创 | 文 BFT机器人 前言 在前阵子落幕的2023世界机器人大会“合作之夜”上&#xff0c;北京经济技术开发区管委会完成了与世界机器人合作组织、小米机器人等16个重点项目签约&#xff0c;推动机器人创新链和产业链融合&#xff0c;其中小米的投资额达到20亿&#xff01; 据了…...

深度学习推荐系统(八)AFM模型及其在Criteo数据集上的应用

深度学习推荐系统(八)AFM模型及其在Criteo数据集上的应用 1 AFM模型原理及其实现 沿着特征工程自动化的思路&#xff0c;深度学习模型从 PNN ⼀路⾛来&#xff0c;经过了Wide&#xff06;Deep、Deep&#xff06;Cross、FNN、DeepFM、NFM等模型&#xff0c;进⾏了大量的、基于不…...

【Spring】aop的底层原理

&#x1f384;欢迎来到边境矢梦的csdn博文&#x1f384; &#x1f384;本文主要梳理 Spring 中的切面编程aop的底层原理和重点注意的地方 &#x1f384; &#x1f308;我是边境矢梦&#xff0c;一个正在为秋招和算法竞赛做准备的学生&#x1f308; &#x1f386;喜欢的朋友可以…...

微信小程序开发---基本组件的使用

目录 一、scroll-view &#xff08;1&#xff09;作用 &#xff08;2&#xff09;用法 二、swiper和swiper-item &#xff08;1&#xff09;作用 &#xff08;2&#xff09;用法 三、text &#xff08;1&#xff09;作用 &#xff08;2&#xff09;使用 四、rich-tex…...

SpringBoot国际化配置组件支持本地配置和数据库配置

文章目录 0. 前言i18n-spring-boot-starter1. 使用方式0.引入依赖1.配置项2.初始化国际化配置表3.如何使用 2. 核心源码实现一个拦截器I18nInterceptorI18nMessageResource 加载国际化配置 3.源码地址 0. 前言 写个了原生的SpringBoot国际化配置组件支持本地配置和数据库配置 背…...

Shell编程之sort

sort 命令将文件的每一行作为比较对象&#xff0c;通过将不同行进行相互比较&#xff0c;从而得到最终结果。从首字符开始&#xff0c;依次按ASCII码值进行比较&#xff0c;最后将结果按升序输出。 基本语法 sort (选项)(参数) 常用选项 常用选项 -n根据字符串的数字比较-r…...

windows docker 容器启动报错:Ports are not available

docker 启动容器报错&#xff1a; (HTTP code 500) server error - Ports are not available: listen tcp 0.0.0.0:6379: bind: An attempt was made to access a socket in a way forbidden by its access permissions. 问题排查 检查端口是否被其它程序占用&#xff1a;nets…...

300. 最长递增子序列

题目描述 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列 是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&#xff0c;[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。 示…...

DNS(域名解析系统)

含义 当我们在上网要访问莫个服务器的时候&#xff0c;就需要知道服务器的IP地址&#xff0c;但IP地址是一串数字&#xff0c;虽然这串数字用点分十进制已经清晰不少了&#xff0c;但还是不利于人们记忆和传播&#xff0c;于是人们使用单词来代替IP地址&#xff08;例如baidu&a…...

解决jsp/html界面跳转servlet出现404错误的方法

解决jsp/html界面跳转servlet出现404错误的方法 最近在学习黑马项目过程中遇到的问题 问题一&#xff1a; 检查页面的跳转路径和名称拼写是否正确 问题二&#xff1a; tomcat发布项目时所使用的路径名称与项目不同 在idea右上角点击如图圈住的按钮 在deployment中更改出现…...

catface,使用Interface定义Controller,实现基于Http协议的RPC调用

catface 前言cat-client 模块EnableCatClientCatClientCatMethodCatNoteCatResponesWrapperCatClientConfigurationCatClientProviderCatClientFactoryCatSendInterceptorCatHttpCatPayloadResolverCatObjectResolverCatLoggerProcessorCatResultProcessorCatSendProcessorAbst…...

Linux:LVS (NAT群集搭建)

模拟环境 外网入口服务器 外网 192.168.8.88 内网ip 192.168.254.4 web1 服务器 ip 192.168.254.1 网关&#xff1a; 192.168.254.4 web2 服务器 ip 192.168.254.2 网关&#xff1a; 192.168.254.4 共享存储服务器 ip 192.168.254.3 介绍 访问 外网192.16…...

音乐格式转换mp3怎么转?跟着步骤操作一遍

音乐格式转换mp3怎么转&#xff1f;mp3&#xff0c;一种音频数据压缩格式&#xff0c;由于其极具优势的文件尺寸小和高质量音效&#xff0c;自诞生之日起就占据了主流音乐格式的头把交椅&#xff0c;并且至今仍然受到用户的青睐&#xff0c;稳居音乐领域的霸主地位。在我们繁忙…...

it监控系统可以电脑吗?有什么效果

IT业务监控已经成为公司不可或缺的一部分&#xff0c;以确保业务的正常运行&#xff0c;提高企业的竞争能力。本文将详细介绍IT业务监控的必要性、实施方法以及如何选择合适的监控工具。 IT业务监控的必要性 确保业务稳定运行  IT业务监控可以实时检测公司的工作流程&#x…...

jvs-智能bi(自助式数据分析)9.1更新内容

​jvs-智能bi更新功能 1.报表增加权限功能&#xff08;服务、模板、数据集、数据源可进行后台权限分配&#xff09; 每个报表可以独立设置权限&#xff0c;通过自定义分配&#xff0c;给不同的人员分配不同的权限。 2.报表新增执行模式 可选择首次报表加载数据为最新数据和历…...

【AI大模型】在线大语言模型实现与学习具身智能

目录 一、在线大语言模型的核心实现原理 &#xff08;一&#xff09;基础模型架构与预训练优化 &#xff08;二&#xff09;在线部署与实时交互模块 &#xff08;三&#xff09;持续学习与反馈优化模块 二、在线大语言模型学习具身智能的核心路径 &#xff08;一&#xff…...

3大革新性功能!VoiceFixer全方位语音修复工具让受损音频焕发新生

3大革新性功能&#xff01;VoiceFixer全方位语音修复工具让受损音频焕发新生 【免费下载链接】voicefixer General Speech Restoration 项目地址: https://gitcode.com/gh_mirrors/vo/voicefixer 你是否遇到过珍贵录音因噪音模糊不清的窘境&#xff1f;是否因会议录音质…...

中文AI象年轻小伙与英语AI象老年人:一场算力背后的文明时差

中文AI与英语AI&#xff1a;一场算力背后的文明时差当AI算力的齿轮飞速运转&#xff0c;中文AI与英语AI的差距早已超越“风格不同”&#xff0c;成为算力效率、表达质感与发展潜力的全方位断层——中文AI如意气风发的年轻小伙&#xff0c;灵动通透、反应敏捷&#xff0c;以极低…...

**发散创新:基于Python的鲁棒水印技术实战解析与代码实现**在多

发散创新&#xff1a;基于Python的鲁棒水印技术实战解析与代码实现 在多媒体内容日益泛滥的今天&#xff0c;数字水印技术已成为版权保护、防伪溯源和内容认证的核心手段之一。本文将深入探讨一种基于离散余弦变换&#xff08;DCT&#xff09;的鲁棒图像水印嵌入与提取算法&…...

阿里云服务器+域名备案全流程避坑指南(附小程序开发必备配置)

阿里云服务器与域名备案实战指南&#xff1a;从小程序开发到前后端部署全解析 第一次在阿里云上配置服务器并完成域名备案的经历&#xff0c;就像新手司机独自上高速——既兴奋又忐忑。记得去年我们团队开发校园服务小程序时&#xff0c;原本计划两周完成的服务器部署&#xff…...

别再手动写ZPL了!用C#和斑马官方SDK搞定ZT410 RFID打印机(附中文乱码解决方案)

用C#驱动斑马ZT410 RFID打印机&#xff1a;从基础连接到中文打印实战 斑马ZT410 RFID打印机在物流、零售和资产管理领域应用广泛&#xff0c;但许多开发者仍停留在手动拼接ZPL指令的原始阶段。这种工作方式不仅效率低下&#xff0c;还容易因指令格式错误导致打印失败或RFID写入…...

Qt加载OBJ或STL模型文件,支持鼠标移动、缩放、旋转Demo

Qt加载模型文件obj或者stl实例&#xff0c;支持鼠标移动缩放旋转demo最近在捣鼓Qt的3D可视化功能&#xff0c;发现用Qt搞个模型查看器比想象中简单。咱们先整点实际的——做个能加载obj/stl模型&#xff0c;支持鼠标拖拽旋转、平移、缩放的demo。废话不多说&#xff0c;直接撸代…...

论文省心了!盘点2026年全网爆红的的降AI率平台

轻松降低论文AI率在2026年已不再是天方夜谭。2026年降AI率平台横空出世&#xff0c;实测提速效果炸裂&#xff0c;覆盖AI痕迹消除、文本改写润色、降重优化、学术合规检测四大核心场景&#xff0c;高效搞定毕业论文难题。 一、全流程王者&#xff1a;一站式搞定论文全链路 这类…...

STM32智能车库管理系统设计与实现

基于STM32的智能车库管理系统设计与实现 1. 项目概述 1.1 系统架构 本系统采用双MCU架构设计&#xff0c;主控制器采用STM32系列单片机&#xff0c;负责传感器数据采集、本地显示和报警控制&#xff1b;网络通信模块采用ESP8266 WiFi模块&#xff0c;实现数据上传至云平台。系…...

使用 Aspen Plus 模拟天然气的自热转化

使用aspen plus模拟天然气的自热转化自热重整工艺消耗蒸汽和氧气&#xff0c;将天然气转化为合成气。 事实上&#xff0c;自热转化工艺是放热的部分氧化&#xff08;POX&#xff09;工艺和内热的蒸汽甲烷转化&#xff08;SMR&#xff09;工艺的结合&#xff0c;从热力学角度中和…...