字符函数与字符串函数
前言
本次博客可以说内容最为多的一次博客,讲解同样很细致大家好好看看
1字符函数
在讲解字符函数时,大家得了解什么是字符吧
普通字符'a' ' b' 'c' '1' ' @' 转义字符' \n ' 换行‘ \t’ 水平制表符'\r'回车
大家了解即可
在C语言中字符也可以有分类
所以我们先来看看字符分类函数
1.1字符分类函数

大家看以上函数的参数返回值以及它的功能几乎一致
我们这里以这个函数为例
int isdigit ( int c );
isdigital 是能够判断参数部分的 c 是否是字符‘0’--‘9’的
代码
#include <stdio.h>
#include <ctype.h>
int main ()
{char str[]="1776ad";int size=sizeof(str)/sizeof(str[0]);while(size){if(isdigit(str[0]))printf("该字符为数字字符%c\n",str[0]);size--;}return 0;
}
该代码能够把一个字符串中的数字字符找到
看看返回值
A value different from zero (i.e., true) if indeed c is a decimal digit. Zero (i.e., false) otherwise.
如果c确实是十进制数字,则为与零不同的值(即true)。否则为零(即false)
再举一个例子
int islower ( int c );
看代码
#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 -= 32;putchar(c);i++;}return 0;
}
该代码的作用是将字符串中的⼩写字⺟转⼤写,其他字符不变
当然咱么是个细节的人,看看返回值
value different from zero (i.e., true) if indeed c is a lowercase alphabetic letter. Zero (i.e., false) otherwise.
如果c确实是小写字母,则值与零不同(即true)。否则为零(即false)
上面的每一个函数的表达式几乎一样,这里不再赘述,注意还是要看看返回值的含义
而且,发现了没有参数是int但是功能却是判断字符串
主要是中间其实发生了类型转换,本身int类型是大于char类型的
1.2字符转换函数
我们在这里讲解两个
int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写
int toupper ( int c );//将参数传进去的⼩写字⺟转⼤写
值得注意的是,他是完全可以有我们自主实现的
那么,我们可以模拟实现该函数
当然我们上一个代码其实就是它的模拟实现
所以,我们只是举一个例子就好
#include<ctype.h>
#include<stdio.h>
int main()
{
char a[]="jdkalkdkjakldkj\n";
int i=0;
while(a[i])
{
toupper(a[i]);
puchar(a[i])
i++;
}
return 0;
}
这个代码就是把小写字母变为大写字母
2字符串函数
2.1 strlen 的使⽤和模拟实现
定义
size_t strlen ( const char * str );
作用计算字符串的长度
字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前⾯出现的字符个数 不包 含 '\0'
参数指向的字符串必须要以 '\0' 结束。
注意函数的返回值为 size_t,是⽆符号的( 易错 )
strlen的使⽤需要包含头⽂件
1strlen的使用
看代码
#include<string.h>
#include<stdio.h>
int main()
{char a[]=“jdlkalkdjkllkakldjkl”;
strlen(a);
return 0;
}
其实这个代码就是计算了字符串的长度
2模拟实现
分析 首先strlen函数得要接收一个地址类型是char *
返回一个无符号的数代表该字符串的长度
代码1实现
size_t My_strlen(const char* dest)
{assert(dest);int count = 0;while (*dest++)//当* dest为\0时 它的ASCLL码值为0{count++;}return count;
}
int main()
{char a[] = "jkaldkljda";printf("%zd\n", My_strlen(a));printf("%zd\n", strlen(a));return 0;
}
看结果

代码2实现
size_t My_strlen(const char* dest)
{assert(dest);char* p1 = (char *)dest;while (*dest++);//当* dest为\0时 它的ASCLL码值为0return dest-p1-1;
}
int main()
{char a[] = "jkaldkljdadakjkjlaksc";printf("%zd\n", My_strlen(a));printf("%zd\n", strlen(a));return 0;
}
其实就是把最后结果变为 指针-指针
但是由于*dest为‘\n’时有后置加加所以要多减去一个1
结果是一样的
2.2strcpy 的使⽤和模拟实现
• Copies the C string pointed by source into the array pointed by destination, including the terminating null character (and stopping at that point).
• 源字符串必须以 '\0' 结束
• 会将源字符串中的 '\0' 拷⻉到⽬标空间
• ⽬标空间必须⾜够⼤,以确保能存放源字符串
• ⽬标空间必须可修改
上面同样是注意事项
1strcpy的使用
int main()
{char a[10] = "djklak";char b[20] = { 0 };strcpy(b, a);printf("%s", b);return 0;
}
2strcpy的模拟实现
char *strcpy( char *strDestination, const char *strSource );
返回值为目的地址
看代码
char *My_strcpy(char *dest,const char *src)
{assert(dest && src);char* p1 = dest;while (*dest++ = *src++);return p1;
}
看结果

3.3.strcat 的使⽤和模拟实现
• Appends a copy of the source string to the destination string. The terminating null character in destination is overwritten by the first character of source, and a null-character is included at the end of the new string formed by the concatenation of both in destination.
源字符串必须以 '\0' 结束 ⽬标字符串中也得有 \0 ,否则没办法知道追加从哪⾥开始。
⽬标空间必须有⾜够的⼤,能容纳下源字符串的内容。
⽬标空间必须可修改。
1strcat的使用
看代码
int main()
{char a[20] = "hello";char b[10] = " world";strcat(a, b);printf("%s\n", a);return 0;
}
2strcat的模拟实现
char *strcat( char *strDestination, const char *strSource );
char* My_strcat(char* dest, const char* src)
{char* ret = dest;assert(dest && src);while (*(++dest));while (*dest++ = *src++);return ret;
}
int main()
{char a[20] = "hello";char b[10] = " world";char c[20] = "hello";My_strcat(a, b);strcat(c, b);printf("%s\n", a);printf("%s\n", c);return 0;
}
看结果

3.4strcmp 的使⽤和模拟实现
• This function starts comparing the first character of each string. If they are equal to each other, it continues with the following pairs until the characters differ or until a terminating null-character is reached.
•标准规定:第⼀个字符串⼤于第⼆个字符串,则返回⼤于0的数字 ◦ 第⼀个字符串等于第⼆个字符串,则返回0
第⼀个字符串⼩于第⼆个字符串,则返回⼩于0的数字
那么如何判断两个字符串? ⽐较两个字符串中对应位置上字符ASCII码值的⼤⼩
1strcmp的使用
int main()
{char* a = "jdkajkd";char* b = "djajdascdad";int flag = strcmp(a, b);if (flag > 0)printf("第一个字符串大\n");else if (flag == 0)printf("两个一样大\n");elseprintf("第二个字符串的\n");return 0;
}
2strcmp的模拟实现
int strcmp( const char *string1, const char *string2 );
int My_strcmp(const char* string1,const char *string2)
{assert(string1 && string2);while (*string1 && *string2){if (*string1 == *string2){string1++; string2++;}elsebreak;}return *string1 - *string2;
}
int main()
{char* a = "jdkajkd";char* b = "djajdascdad";int flag1=strcmp(a, b);int flag2 = My_strcmp(a, b);if (flag1*flag2>=0)printf("模拟成功\n");if (flag1 > 0)printf("第一个字符串大\n");else if (flag1== 0)printf("两个一样大\n");elseprintf("第二个字符串大\n");return 0;
}
看结果

3.5strncat 的使⽤和模拟实现
strncat就是多了个参数,限定copy的字符串大小
将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加⼀个 \0 字 符
如果source 指向的字符串的⻓度⼩于num的时候,只会将字符串中到 \0 的内容追加到destination指向的字符串末尾
1strncat的使用
#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;
}
2strncat的模拟实现
char * strncat ( char * destination, const char * source, size_t num );
char *My_strncat(char *dest,const char *src,size_t n)
{char* ret = dest;assert(dest && src);while (*(++dest));while (n--&&*src)*dest++ = *src++;*dest = '\0';return ret;
}
int main()
{char str1[20];char str2[20];char str3[20];strcpy(str1, "To be ");strcpy(str2, "or not to be");strcpy(str3, "To be ");My_strncat(str1, str2, 6);strncat(str3, str2, 6);printf("%s\n", str1);printf("%s\n", str3);return 0;
}
看结果

3.6strncmp的使⽤和模拟实现
⽐较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0.
1strncmp的使用
#include <stdio.h>
#include <string.h>
int main ()
{char *p1="abcde";char *p2="abcfe";int a=strncmp(p1,p2,3);
if(a>0)
printf("第一个字符串在前3个字符中更大\n");
else if(a=0)
printf("两个字符串在前3个字符中一样大\n");
else
printf("第二个字符串在前3个字符中更大\n");return 0;
}
2strncmp模拟实现
int My_strncmp(const char* str1, const char* str2,size_t n)
{assert(str1 && str2);while (n--&& *str1 && *str2){if (*str1 == *str2){str1++; str2++;}}return *str1 - *str2;
}
int main()
{char* p1 = "abcde";char* p2 = "abcfe";int a = strncmp(p1, p2, 3);int b = My_strncmp(p1, p2, 3);if (a * b >= 0)printf("模拟成功\n");if (a > 0)printf("第一个字符串在前3个字符中更大\n");else if (a==0)printf("两个字符串在前3个字符中一样大\n");elseprintf("第二个字符串在前3个字符中更大\n");return 0;
}
看结果

3.7strstr 的使⽤和模拟实现
1strstr的使用
char * strstr ( const char * str1, const char * str2);
函数返回字符串str2在字符串str1中第⼀次出现的位置
字符 串的⽐较匹配不包含 \0 字符,以 \0 作为结束标志
#include <stdio.h>
#include <string.h>
int main ()
{char str[] ="This is a simple string";char * pch;pch = strstr (str,"simple");strncpy (pch,"sample",6);printf("%s\n", str);return 0;
}
2strstr模拟实现
int main()
{char *p=strstr("abcdefg","cd");printf("%s", p);return 0;
}
//2模拟实现一下
char* My_strstr(const char* p1, const char* p2)
{const char* cur=p1;const char* p3=p2;while (*cur){cur = p1;p3 = p2;while ((*p3&&*cur)&&*cur++==*p3++)if (!*p3)return (char*)p1;if (*cur)p1++;elsereturn NULL;}return NULL;
}
看结果

总结
这几个字符串函数的模拟实现花了不少时间才手打完
ok祝大家开心
相关文章:
字符函数与字符串函数
前言 本次博客可以说内容最为多的一次博客,讲解同样很细致大家好好看看 1字符函数 在讲解字符函数时,大家得了解什么是字符吧 普通字符a b c 1 转义字符 \n 换行‘ \t’ 水平制表符\r回车 大家了解即可 在C语言中字符也可以有分类 所以我们先来看看…...
Kubernetes 项目整体布局 el-container
整体布局整体布局 你可能会去敲不同的项目,有很多种平台。那么其实都是可以复用的。唯一不同的就是main里面的内容是不同的,边框架子都是相同的。其实框架是不怎么变化的,变化的是main里面。 src/layout/Layout.vue 这里需要新增一个页面Lay…...
AI赋能写作:AI大模型高效写作一本通
❤️作者主页:小虚竹 ❤️作者简介:大家好,我是小虚竹。2022年度博客之星评选TOP 10🏆,Java领域优质创作者🏆,CSDN博客专家🏆,华为云享专家🏆,掘金年度人气作…...
unraid docker.img扩容
unraid 弹Docker image disk utilization of 99%,容器下载/更新失败 我的版本是6.11.5,docker.img满了导致容器不能更新,遇到同样问题的可以先用docker命令清除一下仓库(当然不一定能清理出来,我已经清理过只清理出来1G多点&…...
Python 实现1~100之间的偶数求和
result0 for i in range(101):if i%20:result result i print(result) 或者 result0 for i in range(2,101,2):result result i print(result)...
Leetcode 387. First Unique Character in a String
Problem Given a string s, find the first non-repeating character in it and return its index. If it does not exist, return -1. Algorithm Use two lists: one list is used to count the letters in “s”; the other list is the position where the letter first …...
c++ 自己实现一个迭代器
具体代码 /*自定义迭代器的实现 */ #include <iostream> using namespace std; class num {int val; //具体的数字int length; //数字的位数void calculate_length(){if(val/100){ //这个数字只有1位length1;return;}int x10; //这里就是不断重复除直…...
HarmonyOS NEXT应用开发—图片压缩方案
介绍 图片压缩在应用开发中是一个非常常见的需求,特别是在处理用户上传图片时,需要上传指定大小以内的图片。目前图片压缩支持jpeg、webp、png格式。本例中以jpeg图片为例介绍如何通过packing和scale实现图片压缩到目标大小以内。 效果图预览 使用说明…...
深入理解nginx的请求限速模块[下]
目录 3. 源码分析3.1 配置指令3.1.1 limit_req_zone指令3.1.2 limit_req指令3.1.3 limit_req_dry_run指令3.1.4 limit_req_log_level指令3.1.5 limit_req_status指令3.2 模块初始化3.3 请求处理3.3.1 ngx_http_limit_req_handler3.3.1 ngx_http_limit_req_lookup3.3.2 ngx_http…...
王者归位:Kafka控制器组件解析
欢迎来到我的博客,代码的世界里,每一行都是一个故事 王者归位:Kafka控制器组件解析 前言控制器组件简介控制器组件的定义和作用:为什么控制器是分布式系统的核心? 保存了什么数据控制器的指定和切换故障转移控制器故障…...
XmlHttpRequest responseType: ‘stream‘ 图片代理服务器
它是一个存在于原生 XMLHttpRequest 对象中的属性。在 Web API 中,XMLHttpRequest 对象用于发送 HTTP 或 HTTPS 请求到服务器,并接收响应。responseType 属性就是用来指定预期从服务器返回的响应数据的类型。 默认值 responseType的默认值为json&#x…...
手写 UE4中的 TArray
#pragma once #include<iostream> #include<stdexcept> #define CHECK_INDEX_RANGE(Index) if (Index > ElementCount) throw std::out_of_range("索引超出界限")template<typename ElementType> class TArray {typedef unsigned int uint; pri…...
Flink实时写Hudi报NumberFormatException异常
Flink实时写Hudi报NumberFormatException异常 问题描述 在Flink项目中,针对Hudi表 xxxx_table 的 bucket_write 操作由于 java.lang.NumberFormatException 异常而从运行状态切换到失败状态。异常信息显示在解析字符串"ddd7a1ec"为整数时出现了问题。报…...
Dataset与DataLoader、transform
文章目录 1、Dataset2、DataLoader2.1 参数详解2.1.1 num_works2.1.2 pin_memory2.1.3 collate_fn 3、图像增强4、重写transform 1、Dataset 在 PyTorch 中,如果要创建自定义的数据集(Dataset),通常会继承 torch.utils.data.Data…...
海豚调度系列之:认识海豚调度
海豚调度系列之:认识海豚调度 一、海豚调度二、特性三、建议配置四、名次解释 一、海豚调度 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景,提供了一个可视化操作任务、工作流和全生命周期数据处理过…...
MateBook 14s 2023款 集显 触屏(HKFG-16)原厂Win11系统
HUAWEI华为MateBook14s笔记本电脑2023款原装Windows11,恢复出厂开箱状态系统下载 适用型号:HKFG-XX、HKFG-16、HKFG-32 链接:https://pan.baidu.com/s/1GBPLwucRiIup539Ms2ue0w?pwdfm41 提取码:fm41 原厂系统自带所有驱动、…...
zookeeper快速入门(合集)
zookeeper作为一个分布式协调框架,它的创建就是为了方便或者简化分布式应用的开发。除了服务注册与发现之外,它还能够提供更多的功能,但是对于入门来说,看这一篇就够了。后续会讲zookeeper的架构设计与原理,比如zookee…...
鸿蒙App开发学习 - TypeScript编程语言全面开发教程(上)
背景 根据鸿蒙官方的说明: ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript(简称TS)生态基础上做了进一步扩展,继承了TS的所有特性,是TS的超集。因此,在学习ArkTS语言之前&#…...
Java语言: JVM
1.1 内存管理 1.1.1 JVM内存区域 编号 名字 功能 备注 1 堆 主要用于存放新创建的对象 (所有对象都在这里分配内存) jdk1.8之后永久代被替换成为了元空间(Metaspace) 2 方法区(加、常、静、即) 被虚拟机加载的类信息(版本、字段、方法、接口…...
下拉树级带搜索功能
可以直接复制粘贴到自己的项目里,方法处把接口替换一下 <template><div><el-popoverplacement"bottom"width"200"trigger"click"><el-inputslot"reference"class"mrInput":placeholder"placehol…...
VB.net复制Ntag213卡写入UID
本示例使用的发卡器:https://item.taobao.com/item.htm?ftt&id615391857885 一、读取旧Ntag卡的UID和数据 Private Sub Button15_Click(sender As Object, e As EventArgs) Handles Button15.Click轻松读卡技术支持:网站:Dim i, j As IntegerDim cardidhex, …...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
C++.OpenGL (14/64)多光源(Multiple Lights)
多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...
