C语言第二十五弹---字符函数和字符串函数(上)

 

个人主页: 熬夜学编程的小林

💗系列专栏: 【C语言详解】 【数据结构详解】

目录

1、字符分类函数

2、字符转换函数

3、strlen的使用和模拟实现

4、strcpy 的模拟实现

5、strcat 的模拟实现

6、strcmp 的模拟实现

7、strncpy 函数的使用

总结


在编程的过程中,我们经常要处理字符和字符串,为了方便操作字符和字符串,C语言标准库中提供了 ⼀系列库函数,接下来我们就学习⼀下这些函数。

1、字符分类函数

C语言中有⼀系列的函数是专门做字符分类的,也就是⼀个字符是属于什么类型的字符的。
这些函数的使用都需要包含⼀个头文件是 ctype.h
int islower ( int c );
islower 是能够判断参数部分的 c 是否是小写字母的。
通过返回值来说明是否是小写字母, 如果是小写字母就返回非0的整数,如果不是小写字母,则返回0。
上述函数比较简单,uu们自行验证啦,最好通过查库函数的相关知识验证喔~
练习:
写⼀个代码,将字符串中的小写字母转大写,其他字符不变。
#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;//大小写之间ASCII码值间隔32,也可以通过两个字符相减,即'a'-'A';putchar(c);//输出该字符i++;}return 0;
}

2、字符转换函数

C语言提供了2个字符转换函数:
int tolower ( int c ); //将参数传进去的⼤写字⺟转⼩写 
int toupper ( int c ); //将参数传进去的⼩写字⺟转⼤写
上面的代码,我们将小写转大写,是 -32 完成的效果,有了转换函数,就可以直接使用  tolower
数。
#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;
}

3、strlen的使用和模拟实现

注:在模拟实现函数时,尽可能的将以下五个点都考虑到。

1.参数顺序

2.const修饰指针(防止指针被修改)
3.函数的功能,停止条件

4.assert(对空指针进行判断)
5.函数返回值

size_t strlen ( const char * str );
字符串以 '\0' 作为结束标志,strlen函数返回的是在字符串中 '\0' 前面出现的字符个数(不包含 '\0' )。
参数指向的字符串必须要以 '\0' 结束。
注意函数的返回值为size_t,是无符号的( 易错 )
strlen的使用需要包含头文件
学会strlen函数的模拟实现
#include <stdio.h>
#include <string.h>//strlen函数需包含的头文件
int main()
{const char* str1 = "abcdef";const char* str2 = "bbb";if(strlen(str2)-strlen(str1)>0){printf("str2>str1\n");} else{printf("srt1>str2\n");}return 0;
}
strlen的模拟实现:
方式1:
strlen计算的是传入的指针到'\0'之间个数,我们第一想到的肯定是通过遍历该数组,计算字符串长度,然后根据上面注意的五个点,一步一步进行实现。
首先参数顺序,只有一个参数不需要管顺序。
第二个const修饰指针,此处只需遍历数组不会修改字符,因此可以用const修饰指针。
第三个函数功能是计算字符串长度,'\0'之前的长度。
第四个assert断言,传参是指针,所以有可能是空指针,此处可以进行断言,空指针则报错。
第五个返回值位无符号整数,C语言提供无符号整数类型size_t,此处用int影响也不会很大,只是用size_t更加标准准确。
//计数器方式
size_t my_strlen(const char * str)
{int count = 0;assert(str);//空指针则报错while(*str)//遍历字符串,遇到'\0'则结束循环{count++;str++;}return count;//返回大小
}
方式2:
递归实现,长度=1+strlen(str+1),字符串长度=该字符+后面字符串的长度。
//不能创建临时变量计数器
size_t my_strlen(const char * str)
{assert(str);//空指针则报错if(*str == '\0')return 0;elsereturn 1+my_strlen(str+1);
}
方式3:
根据前面指针知识所学,指针-指针=相差元素个数,因此字符串长度可以通过指针-指针计算。
//指针-指针的⽅式
size_t my_strlen(const char *s)
{assert(str);char *p = s;while(*p != ‘\0’ )p++;return p-s;
}

4、strcpy 的模拟实现

 char* strcpy(char * destination, const char * source );
Copies the C string pointed by source into the array pointed by destination, including the
terminating null character (and stopping at that point).
将 source 指向的 C 字符串复制到目标指向的数组中,包括终止 null 字符(并在该点停止)。
源字符串必须以 '\0' 结束。
会将源字符串中的 '\0' 拷贝到目标空间。
目标空间 必须足够大,以确保能存放源字符串。
目标空间必须可修改。
学会模拟实现。
strcpy的模拟实现:
//1.参数顺序 第一个为目标字符串,第二个为原来字符串
//2.const修饰指针 目标需要修改,原来不需要修改
//3.函数的功能,停⽌条件
//4.assert 两个均不能为空指针
//5.函数返回值 返回目标字符串首地址
//6.题⽬出⾃《⾼质量C/C++编程》书籍最后的试题部分
char *my_strcpy(char *dest, const char*src)
{ char *ret = dest;assert(dest != NULL);//为真则不报错assert(src != NULL);//为真则不报错while((*dest++ = *src++)){;}return ret;
}

5、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.
将源字符串的副本追加到目标字符串。destination 中的终止 null 字符被 source 的第一个字符覆盖,并且在 destination 中由两者串联形成的新字符串的末尾包含一个 null 字符。
源字符串必须以 '\0' 结束。
目标字符 串中也得有 ' \0'  ,否则没办法知道追加从哪里开始。
目标 空间必须有足够的大,能容纳下源字符串的内容。
目标 空间必须可修改。
字符串自己给自己追加,如何?
模拟实现strcat函数:
char *my_strcat(char *dest, const char*src)
{char *ret = dest;assert(dest != NULL);assert(src != NULL);while(*dest){dest++;}while((*dest++ = *src++)){;}return ret;
}

6、strcmp 的模拟实现

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.
此函数开始比较每个字符串的第一个字符。如果它们相等,则继续往下比较,直到字符不同或终止达到 null-character。
标准规定:
第⼀个字符串大于第⼆个字符串,则返回大于0的数字
第⼀个字符串等于第⼆个字符串,则返回0
第⼀个字符串小于第⼆个字符串,则返回小于0的数字
那么如何判断两个字符串? 比较两个字符串中对应位置上字符ASCII码值的大小。
strcmp函数的模拟实现:
int my_strcmp (const char * str1, const char * str2)
{int ret = 0 ;assert(src != NULL);assert(dest != NULL);while(*str1 == *str2){if(*str1 == '\0')//两个字符串相等且遇到'\0'即字符串相等,返回0return 0;str1++;str2++;}return *str1-*str2;//不相等返回差值,>0即str1大,<0即str2大
}

7、strncpy 函数的使用

char * strncpy ( char * destination, const char * source, size_t num );
Copies the first num characters of source to destination. If the end of the source C string
(which is signaled by a null-character) is found before num characters have been copied,
destination is padded with zeros until a total of num characters have been written to it.
将源的前 num 个字符复制到目标。如果源 C 字符串的末尾(由 null 字符表示)在复制 num 个字符之前找到,destination 用零填充,直到总共写入了 num 个字符。
拷贝num个字符从源字符串到目标空间。
如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个。
#include <stdio.h>
#include <string.h>//strncpy函数需包含的头文件
int main()
{char str1[]="abcdeef";char str2[20]={0};strncpy(str2,str1,5);printf("%s\n",str2);return 0;
}

总结


本篇博客就结束啦,谢谢大家的观看,如果公主少年们有好的建议可以留言喔,谢谢大家啦!

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

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

相关文章

[word] word怎么取消隐藏文字 #职场发展#微信

word怎么取消隐藏文字 Word有很多实用的技巧&#xff0c;学会了可以节省大量的时间在编辑上。今天就给大家分享下word怎么取消隐藏文字这个小技能。 1.选中内容设置 首先先显示段落符号标记(快捷鍵Ctrl Shift8)&#xff0c;之后选中文本内容。 2.设置取消隐藏的文字 点击开始…

基于 InternLM 和 LangChain 搭建你的知识库(三)

基于 InternLM 和 LangChain 搭建你的知识库 大模型开发范式 Finetune 在大型语言模型中&#xff0c;Finetune&#xff08;微调&#xff09;是一种技术&#xff0c;用于调整预训练的模型以提高其在特定任务或数据集上的表现。这种方法通常涉及以下步骤&#xff1a; 预训练模…

FreeRTOS 延迟中断处理

采用二值信号量同步 二值信号量可以在某个特殊的中断发生时&#xff0c;让任务解除阻塞&#xff0c;相当于让任务与中断 同步。这样就可以让中断事件处理量大的工作在同步任务中完成&#xff0c;中断服务例程(ISR) 中只是快速处理少部份工作。如此&#xff0c;中断处理可以说是…

【自然语言处理】:实验1布置,Word2VecTranE的实现

清华大学驭风计划 因为篇幅原因实验答案分开上传&#xff0c;答案链接http://t.csdnimg.cn/5cyMG 如果需要详细的实验报告或者代码可以私聊博主 有任何疑问或者问题&#xff0c;也欢迎私信博主&#xff0c;大家可以相互讨论交流哟~~ 实验1&#xff1a; Word2Vec&TranE的…

【动态规划】【C++算法】1563 石子游戏 V

作者推荐 【数位dp】【动态规划】【状态压缩】【推荐】1012. 至少有 1 位重复的数字 本文涉及知识点 动态规划汇总 LeetCoce:1563 石子游戏 V 几块石子 排成一行 &#xff0c;每块石子都有一个关联值&#xff0c;关联值为整数&#xff0c;由数组 stoneValue 给出。 游戏中…

java 宠物在线商城系统Myeclipse开发mysql数据库web结构jsp编程servlet计算机网页项目

一、源码特点 java 宠物在线商城系统是一套完善的java web信息管理系统 servletdaobean mvc模式&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S 模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&…

网络安全威胁,如何解决缓冲区溢出攻击

目录 一、什么是网络安全 二、什么是缓冲区 三、缓冲区溢出 四、缓冲区溢出攻击的类型 一、什么是网络安全 网络安全&#xff08;Network Security&#xff09;指的是保护计算机网络及其相关设备、系统和数据免受未经授权访问、破坏、篡改、窃取或滥用的威胁和攻击。随着网…

分布式事务详解

概述 随着互联网的发展,软件系统由原来的单体应用转变为分布式应用。分布式系统把一个单体应用拆分为可独立部署的多个服务,因此需要服务与服务之间远程协作才能完成事务操作。这种分布式系统下不同服务之间通过远程协作完成的事务称之为分布式事务,例如用户注册送积分事务…

QEMU使用步骤

1、安装虚拟机环境&#xff1a;ubuntu-16.04.7-desktop-amd64.iso,下载地址&#xff1a;Index of /ubuntu-releases/16.04.7/ | 清华大学开源软件镜像站 | Tsinghua Open Source Mirror 2、安装gcc-linaro-7.3.1-2018.05-x86_64_arm-linux-gnueabihf.tar.xz到/opt目录&#xf…

1.Electron初始与安装

这里写目录标题 一、前言二、下载三、简要总结 一、前言 原文以及该系列后续文章请参考&#xff1a;安装Electron 随着前端的不断强盛&#xff0c;现在的前端已经不再满足于网页开发了&#xff0c;而是在尝试能否使用前端的开发逻辑来开发PC端的桌面软件。 即用html、js、css…

BDD - Python Behave 用户自定义配置文件

BDD - Python Behave 用户自定义配置文件 引言默认 behave.ini 配置文件自定义配置文件json 格式的配置文件ini 格式的配置文件 实例应用项目结构代码BDD/Features/user_data.feature 文件BDD/steps/user_data_steps.py 文件BDD/environment.py 文件默认配置文件 behave.ini自定…

初识Qt | 从安装到编写Hello World程序

文章目录 1.前端开发简单分类2.Qt的简单介绍3.Qt的安装和环境配置4.创建简单的Qt项目 1.前端开发简单分类 前端开发&#xff0c;这里是一个广义的概念&#xff0c;不单指网页开发&#xff0c;它的常见分类 网页开发&#xff1a;前端开发的主要领域&#xff0c;使用HTML、CSS …