C语言复习笔记--字符函数和字符串函数(上)

news2025/4/21 22:47:10

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

        首先来看下字符函数.

字符分类函数

        C语⾔中有⼀系列的函数是专⻔做字符分类的,也就是⼀个字符是属于什么类型的字符的。 这些函数的使⽤都需要包含⼀个头⽂件是 ctype.h.具体的一些函数和功能见下.

        这些函数的使⽤⽅法⾮常类似,我们来以islower来看下,islower是判断字符是否为小写字母的函数.函数原型见下

int islower ( int c );

通过返回值来说明是否是⼩写字⺟,如果是小写字母就返回非0的整数,如果不是⼩写字⺟,则返回 0。

        下面让我们通过一个练习来使用一下它

写⼀个代码,将字符串中的⼩写字⺟转⼤写,其他字符不变。

#include<stdio.h>
#include<ctype.h>
int main()
{
	char arr[] = { "AccDSnj" };
	char* p = arr;
	while (*p)
	{
		if (islower(*p))
		{
			*p -= 32;//小写ASCII码-32就会变为大写
		}
		p++;
	}
	printf("%s\n", arr);
	return 0;
}

字符转换函数

        C语⾔提供了2个字符转换函数:

        看见了这两个函数后,上⾯的代码,我们将⼩写转⼤写,是-32完成的效果,有了转换函数现在就可以直接使⽤ toupper函数.

#include<ctype.h>
int main()
{
	char arr[] = { "AccDSnj" };
	char* p = arr;
	while (*p)
	{
		if (islower(*p))
		{
			*p = toupper(*p);
			//toupper的返回值才是所传参数的大写,所以直接toupper(*p);无法改变arr中的值
		}
		p++;
	}
	printf("%s\n", arr);
	return 0;
}

        使用这些函数一定要包含<ctype.h>这个头文件.

        下面来看下字符串函数吧.

strlen的使用和模拟实现

        首先看下它的函数原型

size_t   strlen  ( const char * str );

        下面看下使用的主意事项

        要包含<string.h>这个头文件.且返回值为无符号整型,无符号整型进行加减是不会出现<0的数的.

        我们对strlen应该很熟悉了,在之前我们就已经使用过并且用两种方式模拟实现过strlen(指针-指针和指针后移用count计数)下面我们看下不能创建临时变量计数器怎么实现strlen函数.

//可以用递归的方式去实现
size_t strlen(char* p)
{
	if ('\0'== * p)
	{
		return 0;
	}
	else
	{
		return 1 + strlen(p + 1);
	}
}
int main()
{
	char arr[] = { "asffsg" };
	printf("%d\n", strlen(arr));
	return 0;
}

strcpy的使用和模拟实现

        函数原型.

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

        函数作用将source位置的字符串copy到destination的位置上(包括source字符串中的\0)

        下面看下注意事项

        strcpy的自主实现:

char* strcpy(char* des, const char* p)
{
	char* re = des;//先保存一下目标位置的开始,以便函数返回
	while (*des++ = *p++)
	{
		;
	}//刚好到最后'\0'时*p赋给了*des
    //并且*des++ = *p++式子的返回值是'\0'(ASCII码为0)循环刚好结束
	return re;
}
int main()
{
	char arr[20] = { 0 };
	char* p = "asbcde";//被拷贝的可以是不可修改的也可以可以修改的字符串
	//printf("%s\n",strcpy(arr, p));//这种和下面的那种都可以
	char* s = strcpy(arr, p);
	printf("%s\n", s);
	return 0;
}

strcat 的使用和模拟实现

        先看函数原型

char * strcat (char *dest, const char*src);

        函数作用:在dest字符串后追加src字符串,覆盖dest字符串的\0,但是会追加src的\0.

        下面是一些注意事项.

\

        以及思考一个问题字符串⾃⼰给⾃⼰追加,如何?

        根据函数作用来看是不可以的,因为在追加时会覆盖原来字符串的\0,之后就无法找到要追加的字符串的结束标志了.但是在VS的库函数中的strcat可以做到,但是不建议使用strcat自己给自己追加,因为这只是编译器的自行优化,可能其他编译器下就不可以了.

        下面来看实现:

char* strcat(char* des,const char* p)
{
	char* re = des;
	while (*des)
	{
		des++;
	}
	while (*des++ = *p++)
	{
		;
	}
	return re;
}
int main()
{
	char arr[20] = "abc";
	printf("%s\n", arr);
	char* p = "xxx";
	strcat(arr, p);
	printf("%s\n", arr);
 	return 0;
}

        因为上面介绍的三个函数在使用时可能会发生原来空间不够大导致溢出从而引发错误,为了避免这样的错误,函数库中提供了可以由程序员控制拷贝字母数的下面三个函数.这些函数无需自己实现,只要会使用就可以了.

strncpy 函数的使用      

        首先来看下函数原型

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

        作用:将source的字符串的前num的字符拷贝到destination的位置上.

        如果源字符串长度大于num则num是几就拷贝几个,不在后面追加\0.下面看下使用:

#include <string.h>
int main()
{
	char arr[20] = "xxxxxxxxxxxxx";
	char* p = "abc";
	strncpy(arr, p, 2);
	printf("%s\n", arr);
	strncpy(arr, p, 5);
	printf("%s\n", arr);
	return 0;
}

输出结果:

strncmp函数的使用

        函数原型:

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

        比较str1和str2的前num个字符,如果相等就继续往后⽐较,最多⽐较num个字⺟,如果提前发现不⼀ 样,就提前结束,⼤的字符所在的字符串⼤于另外⼀个。如果num个字符都相等,就是相等返回0.(num不能大于str1和str2中短的那个字符串的长度(算\0)).

        下面是此函数的返回值:

        下面看下使用

#include <string.h>
int main()
{
	char* p = "abcd";
	char* p1 = "abp";
	printf("%d\n",strncmp(p, p1, 2));
	printf("%d\n",strncmp(p, p1, 3));
	return 0;
}

        输出结果: 

 

strncat 函数的使用

        函数原型:

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

        如果source 指向的字符串的⻓度⼩于num的时候,不会向后添加\0让追加字符数达到num.

        下面看下使用:

#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;
}

        输出结果:

        今天的复习就到这里了,我们明天下篇见.

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

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

相关文章

Apipost,前端后端测试都在用的接口设计调试工具

大家好&#xff0c;我是袁庭新。给大家介绍一个后端、前端、测试都在用的接口测试工具——Apipost。Apipost主要分为5个大模块&#xff0c;贯穿一个API从设计到测试完成上线的研发全周期。 1.Apipost介绍 Apipost官方地址&#xff1a;https://www.apipost.cn。如下图所示。 A…

十倍开发效率 - IDEA 插件之RestfulBox - API

提高效率不是为了完成更多的任务&#xff0c;而是有充足的时间摸鱼。 快速体验 RestfulBox - API 是 IDEA 的插件&#xff0c;适合本地测试接口&#xff0c;完全不需要对项目进行任何以来。 接口管理&#xff1a;支持接口扫描、浏览、搜索、跳转、导入和导出。支持接口请求&a…

2025 年网络安全的挑战与机遇

2024 年是网络安全领域风云变幻的一年。从备受瞩目的勒索软件攻击所带来的影响&#xff0c;到人工智能工具日益商品化&#xff0c;挑战不断增加。 关键基础设施的漏洞变得极为明显&#xff0c;身份盗窃次数也达到了前所未有的程度。然而&#xff0c;在这一片混乱之中&#xff…

IP数据报

IP数据报组成 IP数据报&#xff08;IP Datagram&#xff09;是网络中传输数据的基本单位。 IP数据报头部 版本&#xff08;Version&#xff09; 4bit 告诉我们使用的是哪种IP协议。IPv4版本是“4”&#xff0c;IPv6版本是“6”。 头部长度&#xff08;IHL&#xff0c;Intern…

【Lua语言】Lua语言快速入门

初始Lua Lua是一种轻量小巧的脚本语言&#xff0c;他使用标准C语言编写并以源代码形式开放。这意味着Lua虚拟机可以很方便的嵌入别的程序中&#xff0c;从而为应用程序提供灵活的扩展和定制功能。同时&#xff0c;在目前脚本引擎中&#xff0c;Lua的运行速度占有绝对优势。 变…

Silverlight发展历程(微软2021年已经停止支持Silverlight 5)

文章目录 Microsoft Silverlight 发展历程引言起源与背景&#xff08;2006-2007&#xff09;互联网技术格局与微软的挑战WPF/E 项目的启动 Silverlight 1.0 的诞生&#xff08;2007&#xff09;正式命名与首次发布初步的市场定位 Silverlight 2.0&#xff1a;真正的突破&#x…

充电桩领域垂直行业大模型分布式推理与训练平台建设方案 - 慧知开源充电桩平台

没有任何广告&#xff01; 充电桩领域垂直行业大模型分布式推理与训练平台建设方案 一、平台定位与核心价值 行业首个垂直化AI平台 专为充电桩运营场景设计的分布式大模型训练与推理基础设施&#xff0c;实现"算力-算法-场景"三位一体闭环管理。 核心价值主张&am…

区块链交易自动化新时代:实战体验 Maestro 智能机器人

随着 DeFi 和链上交易生态的不断壮大&#xff0c;链上自动化工具的应用正逐渐从「量化机构」走向普通投资者和开发者。在过去的几个月中&#xff0c;我实测了一款基于 Telegram 的交易机器人 —— Maestro&#xff0c;它极大简化了链上套利、复制交易等流程&#xff0c;对我个人…

windows服务器及网络:论如何安装(虚拟机)

今天我要介绍的是&#xff1a;在Windows中对于安装系统&#xff08;虚拟机的步骤以及相关的安装事宜&#xff09;&#xff0c;事不宜迟&#xff0c;让我们来看看系统安装&#xff08;虚拟机&#xff09;是怎么操作的&#xff1a; 对现在来说&#xff0c;安装电脑系统已经是非常…

Hbuilder 上的水印相机实现方案 (vue3 + vite + hbuilder)

效果 思路 通过 live-pusher 这个视频推流的组件来获取摄像头拿到视频的一帧图片之后&#xff0c;跳转到正常的 vue 页面&#xff0c;通过 canvas 来处理图片水印 源码 live-pusher 这个组件必须是 nvue 的 至于什么是 nvue&#xff0c;看这个官方文档吧 https://uniapp.dcl…

TinyEngine 2.4版本正式发布:文档全面开源,实现主题自定义,体验焕新升级!

本文由体验技术团队李璇原创。 前言 TinyEngine低代码引擎使开发者能够定制低代码平台。它是低代码平台的底座&#xff0c;提供可视化搭建页面等基础能力&#xff0c;既可以通过线上搭配组合&#xff0c;也可以通过cli创建个人工程进行二次开发&#xff0c;实时定制出自己的低…

毕业答辩的PPT应该包括哪些内容?

一、PPT 模板的选择 1. 忌单调的白底黑字&#xff0c;应进行一些艺术设计&#xff0c;使人看着画面舒服&#xff0c;但不必过于花哨。总之&#xff0c;专业制作&#xff0c;符合技术人士的喜好。 2. 去掉不相关信息&#xff0c;如一些下载模板上的LOGO。把学校或部门的LOGO放…

Vscode --- LinuxPrereqs │远程主机可能不符合 glibc 和 libstdc++ Vs code 服务器的先决条件

打开vscode连接远程linux服务器&#xff0c;发现连接失败&#xff0c;并出现如下报错信息&#xff1a; 原因是&#xff1a; vscode 官网公告如下&#xff1a;2025 年 3 月 (版本 1.99) - VSCode 编辑器 版本1.97 官网公告如下&#xff1a;链接 版本1.98 官网公告如下&am…

安装部署RabbitMQ

一、RabbitMQ安装部署 1、下载epel源 2、安装RabbitMQ 3、启动RabbitMQ web管理界面 启用插件 rabbitmq数据目录 创建rabbitmq用户 设置为管理员角色 给用户赋予权限 4、访问rabbitmq

Qt实现文件传输客户端(图文详解+代码详细注释)

Qt实现文件传输客户端 1、 客户端UI界面设计2、客户端2.1 添加网络模块和头文件2.2 创建Tcp对象2.3 连接按钮2.3.1 连接按钮连接信号与槽2.3.2 连接按钮实现 2.4 读取文件2.4.1 连接读取文件的信号与槽2.4.2 读取文件槽函数实现2.5 进度条2.5.1 设置进度条初始值2.5.2 初始化进…

机器学习期末

选择题 以下哪项不是机器学习的类型&#xff1f; A. 监督学习 B.无监督学习 C.半监督学习 D.全监督学习 D 哪一个是机器学习的合理定义? A、机器学习是计算机编程的科学 B、机器学习从标记的数据中学习 C、机器学习是允许机器人智能行动的领域 D、机器学习能使计算机能够在…

Python多任务编程:进程全面详解与实战指南

1. 进程基础概念 1.1 什么是进程&#xff1f; 进程(Process)是指正在执行的程序&#xff0c;是程序执行过程中的一次指令、数据集等的集合。简单来说&#xff0c;进程就是程序的一次执行过程&#xff0c;它是一个动态的概念。 想象你打开电脑上的音乐播放器听歌&#xff0c;…

【QT】 QT中的列表框-横向列表框-树状列表框-表格列表框

QT中的列表框-横向列表框-树状列表框-表格列表框 1.横向列表框(1)主要方法(2)信号(3) 示例代码1:(4) 现象&#xff1a;(5) 示例代码2&#xff1a;加载目录项在横向列表框显示(6) 现象&#xff1a; 2.树状列表框 QTreeWidget(1)使用思路(2)信号(3)常用的接口函数(4) 示例代码&am…

决策树:ID3,C4.5,CART树总结

树模型总结 决策树部分重点关注分叉的指标&#xff0c;多叉还是单叉&#xff0c;处理离散还是连续值&#xff0c;剪枝方法&#xff0c;以及回归还是分类 一、决策树 ID3(Iterative Dichotomiser 3) 、C4.5、CART决策树 ID3:确定分类规则判别指标、寻找能够最快速降低信息熵的方…

easyexcel使用模板填充excel坑点总结

1.单层map设置值是{属性}&#xff0c;那使用两层map进行设置值&#xff0c;是不是可以使用{属性.属性}&#xff0c;以为取出map里字段只用{属性}就可以设置值&#xff0c;那再加个.就可以从里边map取出对应属性&#xff0c;没有两层map写法 填充得到的文件打开报错 was empty (…