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

字符函数与字符串函数

前言

本次博客可以说内容最为多的一次博客,讲解同样很细致大家好好看看

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祝大家开心

相关文章:

字符函数与字符串函数

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

Kubernetes 项目整体布局 el-container

整体布局整体布局 你可能会去敲不同的项目&#xff0c;有很多种平台。那么其实都是可以复用的。唯一不同的就是main里面的内容是不同的&#xff0c;边框架子都是相同的。其实框架是不怎么变化的&#xff0c;变化的是main里面。 src/layout/Layout.vue 这里需要新增一个页面Lay…...

AI赋能写作:AI大模型高效写作一本通

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…...

unraid docker.img扩容

unraid 弹Docker image disk utilization of 99%&#xff0c;容器下载/更新失败 我的版本是6.11.5&#xff0c;docker.img满了导致容器不能更新&#xff0c;遇到同样问题的可以先用docker命令清除一下仓库(当然不一定能清理出来&#xff0c;我已经清理过只清理出来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应用开发—图片压缩方案

介绍 图片压缩在应用开发中是一个非常常见的需求&#xff0c;特别是在处理用户上传图片时&#xff0c;需要上传指定大小以内的图片。目前图片压缩支持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控制器组件解析

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 王者归位&#xff1a;Kafka控制器组件解析 前言控制器组件简介控制器组件的定义和作用&#xff1a;为什么控制器是分布式系统的核心&#xff1f; 保存了什么数据控制器的指定和切换故障转移控制器故障…...

XmlHttpRequest responseType: ‘stream‘ 图片代理服务器

它是一个存在于原生 XMLHttpRequest 对象中的属性。在 Web API 中&#xff0c;XMLHttpRequest 对象用于发送 HTTP 或 HTTPS 请求到服务器&#xff0c;并接收响应。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项目中&#xff0c;针对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 中&#xff0c;如果要创建自定义的数据集&#xff08;Dataset&#xff09;&#xff0c;通常会继承 torch.utils.data.Data…...

海豚调度系列之:认识海豚调度

海豚调度系列之&#xff1a;认识海豚调度 一、海豚调度二、特性三、建议配置四、名次解释 一、海豚调度 Apache DolphinScheduler 是一个分布式易扩展的可视化DAG工作流任务调度开源系统。适用于企业级场景&#xff0c;提供了一个可视化操作任务、工作流和全生命周期数据处理过…...

MateBook 14s 2023款 集显 触屏(HKFG-16)原厂Win11系统

HUAWEI华为MateBook14s笔记本电脑2023款原装Windows11&#xff0c;恢复出厂开箱状态系统下载 适用型号&#xff1a;HKFG-XX、HKFG-16、HKFG-32 链接&#xff1a;https://pan.baidu.com/s/1GBPLwucRiIup539Ms2ue0w?pwdfm41 提取码&#xff1a;fm41 原厂系统自带所有驱动、…...

zookeeper快速入门(合集)

zookeeper作为一个分布式协调框架&#xff0c;它的创建就是为了方便或者简化分布式应用的开发。除了服务注册与发现之外&#xff0c;它还能够提供更多的功能&#xff0c;但是对于入门来说&#xff0c;看这一篇就够了。后续会讲zookeeper的架构设计与原理&#xff0c;比如zookee…...

鸿蒙App开发学习 - TypeScript编程语言全面开发教程(上)

背景 根据鸿蒙官方的说明&#xff1a; ArkTS是HarmonyOS优选的主力应用开发语言。ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集。因此&#xff0c;在学习ArkTS语言之前&#…...

Java语言: JVM

1.1 内存管理 1.1.1 JVM内存区域 编号 名字 功能 备注 1 堆 主要用于存放新创建的对象 (所有对象都在这里分配内存) jdk1.8之后永久代被替换成为了元空间&#xff08;Metaspace&#xff09; 2 方法区(加、常、静、即) 被虚拟机加载的类信息(版本、字段、方法、接口…...

下拉树级带搜索功能

可以直接复制粘贴到自己的项目里,方法处把接口替换一下 <template><div><el-popoverplacement"bottom"width"200"trigger"click"><el-inputslot"reference"class"mrInput":placeholder"placehol…...

【数组、字符串】算法例题

每个题的【方法1】是自己的思路&#xff0c;【其他方法】是力扣上更优的解题思路 目录 一、数组、字符串 1. 合并两个有序数组 ① 2. 移除元素 ① 3. 删除有序数组中的重复项 ① 4. 删除有序数组中的重复项 II ② 5. 多数元素 ① 6. 轮转数组 ② 7. 买卖股票的最佳时机…...

docxTemplater——从word模板生成docx文件

官网文档&#xff1a;Get Started (Browser) | docxtemplater 官网在线演示&#xff1a;Demo of Docxtemplater with all modules active | docxtemplater 源码&#xff1a;https://github.com/open-xml-templating/docxtemplater 不仅可以处理word&#xff08;免费&#xf…...

Linux权限维持后门及应急响应

本次应急响应实验用kali和centos7来充当攻击机和靶机 kali&#xff1a;192.168.10.130 centos7&#xff1a;192.168.10.155 前提&#xff1a; 用kali连接到centos7上面ssh root192.168.10.155 一、SSH软链接 任意密码登录即可发现程度&#xff1a;|||||| ln -sf /usr/sbi…...

git相关指令

1、使用 Git 初始化本地仓库&#xff1a; 在命令行中&#xff0c;首先进入你的项目目录&#xff0c;然后使用以下命令初始化一个本地 Git 仓库&#xff1a; git init2、添加文件到本地仓库&#xff1a; 将你的项目文件添加到本地仓库中&#xff0c;使用以下命令&#xff1a; …...

Apache Doris 2.1 核心特性 Variant 数据类型技术深度解析

在最新发布的 Apache Doris 2.1 新版本中&#xff0c;我们引入了全新的数据类型 Variant&#xff0c;对半结构化数据分析能力进行了全面增强。无需提前在表结构中定义具体的列&#xff0c;彻底改变了 Doris 过去基于 String、JSONB 等行存类型的存储和查询方式。为了让大家快速…...

accessToken

1、介绍 accessToken&#xff0c;通常是用于身份验证和授权的令牌,它可以用于前端和后端&#xff0c;具体使用方式取决于应用程序的架构和需求。 前端应用 accessToken通常用于向后端API发送请求时进行身份验证和授权。 &#xff08;1&#xff09;前端应用程序会在用户登录成…...

nodeJs 学习

常用快捷键 二、fs模块 回调函数为空&#xff0c;则表示写入成功&#xff01; 练习 const fs require(fs); fs.readFile(../files/成绩.txt, utf-8, (err, dataStr) > {if (err) {console.log(读取失败);return err;}console.log(读取成功);const arr dataStr.split( )co…...

STM32利用AES加密数据、解密数据

STM32利用AES加密数据、解密数据 MD5在线工具Chapter1 STM32利用AES加密数据、解密数据一、头文件二、源文件三、使用 Chapter2 stm32 的 md5计算函数Chapter3 STM32 应用程序加密的一种设计方案前言一、计算AppKey二、自动配置流程三、出厂固件合并 个人总结 MD5在线工具 htt…...

C语言技能数(知识点汇总)

C语言技能数&#xff08;知识点汇总&#xff09; C 语言概述特点不足之处 标准编程机制 数据类型变量数据类型字符类型整数类型符号位二进制的原码、反码和补码 浮点类型布尔类型 常量字面常量const 修饰的常变量#define定义的标识符常量枚举常量 sizeofsizeof(结构体)不要对 v…...

Vue.js+SpringBoot开发企业项目合同信息系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 合同审批模块2.3 合同签订模块2.4 合同预警模块2.5 数据可视化模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 合同审批表3.2.2 合同签订表3.2.3 合同预警表 四、系统展示五、核心代码5.1 查询合同…...

防腐木用什么名字做网站/网络营销专业课程

计算机汇编语言入门微处理器体系结构基本微处理器设计由时钟同步所有CPU 操作控制器(CU) 协调各执行步骤的顺序运算器(ALU) 进行算术运算和逐位处理时钟同步所有CPU 和总线操作机器(时钟)周期是完成单个操作的时间时钟用来触发事件指令执行周期取指令译码取操作数执行指令输出存…...

破解软件网站/云南网络营销公司哪家好

导读&#xff1a;在进行股权结构设计之前&#xff0c;应该清楚认识到股权结构不是简单的股权比例或投资比例&#xff0c;应该以股东股权比例为基础&#xff0c;通过对公司股东会、董事会及管理层职权与表决程序等进行一系列调整后的股东权利结构体系。一、为什么创业者需了解股…...

网站开发论文简要/环球网疫情最新消息

DSPc语言教程.doc电气专业词汇集散控制系统——Distributed Control System(DCS)现场总线控制系统——Fieldbus Control System(FCS)监控及数据采集系统——Supervisory Control And Data Acqusition(SCADA)可编程序控制器——Programmable Logic Controller(PLC) 可编程计算机…...

javaee做网站建设/最新的疫情信息

public class Test { public static void main(String[] args) { int[] arr{1,3,2,4,5,7,9,8}; int count0; //定义获取的方法 //定义计数器&#xff0c;计算数组中奇数的个数 for(int i0;i<arr.length;i){ if(arr[i]%2!0) count; } //定义新数组存储原数组中的奇数 int[…...

红旗渠建设集团有限公司网站/推广产品的软文

故障模拟# 添加两项配置vi /etc/my.cnf[mysqld]autocommit0innodb_lock_wait_timeout 3600systemctl restart mysqld# 登录数据库use klvchen;UPDATE t1 SET k1av WHERE id1;# 新开一个窗口&#xff0c;再登录数据库use klvchen;UPDATE t1 SET k1az WHERE id1;# 此时页面卡住(…...

动态网站开发日志/亚马逊seo是什么意思

STM32通过DMA采集多通道AD 本文博客链接:http://blog.csdn.net/jdh99,作者:jdh,转载请注明. 环境&#xff1a; 主机:XP 开发环境:MDK4.23 MCU:STM32F103CBT6 说明&#xff1a; 通过脚PA1,PA2采集AD。每路AD采集10次。 参考链接:http://hi.baidu.com/kangxuebin/item/f4f43…...