【C语言】解决不同场景字符串问题:巧妙运用字符串函数
🌈个人主页:是店小二呀
🌈C语言笔记专栏:C语言笔记
🌈C++笔记专栏: C++笔记
🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅
文章目录
- 一、字符函数
- 1.1 字符分类函数
- 1.1.1 islower
- 1.1.2 isupper
- 1.2字符转换函数
- 1.3 字符分类函数与字符转换函数配合
- 二、 字符串函数
- 2.1 Strlen
- 2.2 Strcpy
- 2.3 Strcat
- 2.4 Strcmp
- 对于strcpy和strcat越界的调整
- 2.5 Strncpy
- 2.6 Strncat
- 2.7 Strncmp
- 2.8 Strstr
- 2.9 Strtok
- 2.10 Strerror
一、字符函数
字符函数一般分为字符分类函数和字符转换函数,它们使用的时候可以相互打配合,这些字符函数统一声明在库函数头文件ctype.h
1.1 字符分类函数
以上这些函数使用方式非常类似,这里简单使用两个常用字符分类函数
1.1.1 islower
#include <stdio.h>
#include <ctype.h>
int main()
{int ret=islower('a')return 0;
}
【说明】:
- 字符类型是整型类型的子集,这里可以使用ASCII表达字符
- 判断参数部分是否为小写字母
- 如果是小写字母,就返回非零的整数(为真)
- 如果不是小写字母,就返回零(为假)
1.1.2 isupper
#include <stdio.h>
#include <ctype.h>
int main()
{int ret=isupper('A')return 0;
}
【说明】:
- 字符类型是整型类型的子集,这里可以使用ASCII表达字符
- 判断参数部分是否为大写字母
- 如果是小写字母,就返回非零的整数(为真)
- 如果不是小写字母,就返回零(为假)
如果对于其他字符分类函数使用感兴趣,可以点击这次链接,经行查找搜索->[字符分类函数](scanf - C++ Reference (cplusplus.com))
1.2字符转换函数
C语言提供了以下两个字符转换函数:
int tolower(int c)
功能:将参数部分为小写转化为大写
int toupper (int C)
功能:将参数部分为大写转化为小写
int main()
{int ret=iolower('A');printf("%d",ret);//这里打印出的就是小写areturn 0;
}
1.3 字符分类函数与字符转换函数配合
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);}return 0;
}
二、 字符串函数
2.1 Strlen
int main()
{char * p = "abcd";int ret = strlen(p);return 0;
}
【说明】:
- 计算字符串在\0前面出现的字符个数
- 具体细节,参考这篇文【指针篇5/5】
2.2 Strcpy
- 将原字符串(source)拷贝到目标字符串(destination)。
- 返回值是返回目标字符串中首地址。
int main()
{cosnt char pc[] = "abcdf";1. char p[] = "xxx"; //目标空间缺乏2. char p[] = "XXXXXXxxxx"; //目标空间充足strcpy(p, pc);printf("%s", p);return 0;
}
【说明】:
- 源字符必须以
'\0'
作为结束标志 - 源字符串中的
'\0'
拷贝到目标空间 - 目标字符串是可修改的
- 目标空间需要足够大,不然可能会溢出
- 如果目标空间过小,虽然能打印结果,但会冲出缓冲区
2.3 Strcat
- 在目标字符串末尾’\0’的位置上追加源字符串。
- 目标字符串的首地址。
int main()
{char p[20] = "abcdefl";const char pc[] = "xxxx";strcat(p, pc,);printf("%s", p);return 0;
}
【说明】:
- 源字符必须以
'\0'
作为结束标志 - 目标字符串需要
'\0'
作为结束标志,作为追加位置 - 目标字符串是可修改的
- 目标空间需要足够大,空间容纳下两个字符串连接后的大小
2.4 Strcmp
- strcmp不是比较字符串的长度,而是比较两个字符串中对应位置字符的ASCII码值
int main()
{char p[20] = "abcdef";char pc[20] = "abcf";int ret=strcmp(p, pc);if (ret > 0){printf("大于");}else if (ret == 0){printf("等于");}else{printf("小于");}return 0;
}
【说明】:
- 如果第一个字符串大于第二个字符串的大小,就返回大于0的数
- 如果第一个字符串等于第二个字符串的大小,就返回0
- 如果第一个字符串小于第二个字符串的大小,就返回小于0的数
对于strcpy和strcat越界的调整
【问题】:
- 在使用字符串函数中,strcpy和strcat都存在冲出缓冲区的风险,对此有什么办法可以尽量避免?
库为了对应这种情况的发生,提供了在strcpy和strcat基础上改良了可以控制个数的函数。
2.5 Strncpy
【说明】:
- 将源字符串的num个字符拷贝到目标空间中
- 如果num大于源字符串的数量,拷贝完源字符串后,以后追加
'\0'
直到num个才停下
2.6 Strncat
【说明】:
- 将源字符串的num个字符追加到目标空间中
- 如果num大于源字符串的数量,则拷贝到
'\0'
直接停下
2.7 Strncmp
【说明】:
- 比较dest和str的前num个字符,如果在num前发现了不同,则返回数值,不再继续
- 如果dest和str相等,一直到了num个字符都相等,则返回0
2.8 Strstr
- 在字符串中寻找匹配子字符串并且返回子字符串的地址
int main()
{ char str1[] = "abccdefg";char str2[] = "cd";char *ret=strstr(str1,str2);printf("%s",ret);return 0;
}
【说明】:
- str1和str2不能为
NULL
. - 如果str2不属于str1的字符串,则返回
NULL
.
2.9 Strtok
-
第一个参数指向一个字符串,包括了一个及多个的分隔符和字符组合
-
第二个参数是指向分割符的集合
-
将一个字符串拆分标记,标记是由分隔符分割由任何字符分隔的连续字符串序列
int main()
{char str[] = "192.152.142@dads";char sep[] = ".@";char* p = NULL;for (p = strtok(str, sep); p != NULL; p=strtok(NULL, sep))//循环中利用上面返回值三点的相关知识{printf("%s\n", str);}return 0;
}
【说明】:
- 第一个参数不为NULL,则函数找到str1的第一个标记并且记录当下标记的位置
- 第一个参数为NULL,则从标记的位置,出发寻找下一个标记位置
- 如果字符串中找不到更多的标记,则返回NULL.
【循环体逻辑说明】
- 因为使用一次strtok函数,只能找个一个标记点,所以我们需要用到循环
- 字符串中找不到更多的标记,则返回
NULL
,这个作为结束条件 - strtok函数会找下一个标记,以
\0
来结尾,返回指向这个标记的指针(strtok会改变被操作的字符串,所以strtok函数分割得到的字符串,一般是拷贝内容是可以被修改的)
2.10 Strerror
-
获得参数部分的错误码对应的错误信息
-
将错误信息的字符串地址返回
#include <stdio.h>
#include <errno.h>
int main()
{for (int i = 0; i < 10; i++){printf("%d:%s\n",i, strerror(i));}return 0;
}
【说明】
- 在不同的系统和C语言标准库的实现中将这一些错误码的信息,一般都放在
<errno.h>
头文件中 - 当C语言程序启动的时候,会有一个全面变量
errno去
记录程序中错误码,在程序启动的是时候,errno为0
,表示没有错误。 - 如果在使用标准库中的函数,出现错误,那么就有会由
errno
去记录错误码,如果错误码是=的数字,不知道什么含义**?所以每一个错误码都对应着错误信息**
讲到这里我们也是可以了解下perror函数,它的功能是直接将错误信息打印出来,比较暴力
#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{FILE*p=fopen("add.txt","r");//r的意思打开文件进行输入操作。该文件必须存在。//FILE * fopen ( const char * filename, const char * mode );if(p==NULL){perror("Error opening file add.txt:")//Error opening file add.txt: No such file or directory}return 0;
}
以上就是本篇文章的所有内容,在此感谢大家的观看!这里是店小二C语言笔记,希望对你在学习C语言中有所帮助!
相关文章:

【C语言】解决不同场景字符串问题:巧妙运用字符串函数
🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、字符函数1.1 字符分类函数1.1.1 islower1.1.2 isupper 1.…...
android 如何显示网络地址对应的图片
1.android 如何显示网络地址对应的图片 在Android中显示网络地址对应的图片,通常有多种方法可以实现。以下是几种常见的方法: 1. 使用ImageView和Picasso库 Picasso是一个强大的图片加载库,它可以方便地加载网络图片并显示到ImageView中。 …...

【项目学习01_2024.05.02_Day04】
学习笔记 4 课程分类查询4.1需求分析4.2 接口定义4.3 接口开发4.3.1 树型表查询4.3.2 开发Mapper 4 课程分类查询 4.1需求分析 有课程分类的需求 course_category课程分类表的结构 这张表是一个树型结构,通过父结点id将各元素组成一个树。 利用mybatis-plus-gen…...
Android SQLite中的UNIQUE constraint failed错误
报错信息: UNIQUE constraint failed SQLite中的UNIQUE constraint failed错误,表明尝试插入或更新数据库时出现了违反唯一性约束的情况。唯一性约束确保在特定列或列集合中的值在表中是唯一的,即不能有重复的值。当你尝试插入或更新已存在于…...

嘴尚绝卤味:传承经典,缔造美食新风尚
卤味,作为中国传统美食的代表之一,历经千年的传承与发展,早已成为无数食客餐桌上的宠儿。而在这个美食盛行的时代,嘴尚绝卤味凭借其独特的口感和精湛的工艺,成为卤味市场中的佼佼者,引领着卤味文化的新潮流…...

Docker 入门与实践:从零开始构建容器化应用环境
Docker 一、docker常用命令docker ps 格式化输出Linux设置命令别名 二、数据卷相关命令挂载到默认目录(/var/lib/docker)挂载到本地目录 三、自定义镜像Dockerfile构建镜像的命令 四、网络自定义网络 五、DockerCompose相关命令 一、docker常用命令 dock…...
C# 用户控件UserControl事件解绑资源释放
用户控件继承子 UserControl 。 现在有个业务需求在UserControl 所在的窗体关闭时解除事件HMouseDown绑定。 因没有相关的Close事件。后来本人想了一个办法在 ROICtlDesigner类的 Dispose 方法中执行相关的释放代码 比如解除事件绑定 释放资源 public partial class ROICt…...

QT-QTCreator环境配置
准备工作: 下载QT: 链接:https://pan.baidu.com/s/1prJcsC4DGqhKiXvLuPQFVA?pwd60b3 提取码:60b3下载WindowsKits: 链接:https://pan.baidu.com/s/1QNiS3HpbH5M5kXx5AhkqnQ?pwde2h8 提取码:e2h8安装的…...
最大连续和
【问题描述】 对于一个具有n个元素的整型数组 a,求具有最大连续和的子数组(最少具有一个元素)。 【输入形式】 输入的第一行为一个整数 n,接下来的一行为 n 个整数,表示数组的元素。 【输出形式】 输出具有最大连续和的…...

分布式系统事务一致性解决方案(基于事务消息)
参考:https://rocketmq.apache.org/zh/docs/featureBehavior/04transactionmessage/ 文章目录 概要错误的方案方案一:业务方自己实现方案二:RocketMQ 事务消息什么是事务消息事务消息处理流程事务消息生命周期使用限制使用示例使用建议 概要 …...

Unity Animation--动画剪辑
Unity Animation--动画剪辑 动画剪辑 动画剪辑是Unity动画系统的核心元素之一。Unity支持从外部来源导入动画,并提供创建动画剪辑的能力使用“动画”窗口在编辑器中从头开始。 外部来源的动画 从外部来源导入的动画剪辑可能包括: 人形动画 运动捕捉…...

如何将 redis 快速部署为 docker 容器?
部署 Redis 作为 Docker 容器是一种快速、灵活且可重复使用的方式,特别适合开发、测试和部署环境。本文将详细介绍如何将 Redis 部署为 Docker 容器,包括 Docker 安装、Redis 容器配置、数据持久化、网络设置等方面。 步骤 1:安装 Docker 首…...

iOS - Undefined symbols: 解决方法
Undefined symbols: 是让人苦恼的报错,如何知道是 哪个 symbols 不对呢? 今天探索到下面的方法: 1、点击导航上方 最右侧的按钮,查看历史报错 2、选中报错信息,右键选择 Expand All Transcripts 在出现的详细信息面…...

优化理论复习——(三)
本篇介绍无约束优化的问题,通过四种算法来进行求解的过程和思路,也是最优化方法中的最重要的一类问题。 无约束优化问题主要是通过迭代搜索算法来切结,比线性规划的计算量都小一点。 目录 无约束优化问题最优性条件最速下降法牛顿法共轭梯度…...

RK3568笔记二十四:基于Flask的网页监控系统
若该文为原创文章,转载请注明原文出处。 此实验参考 《鲁班猫监控检测》,原代码有点BUG,已经下载不了。2. 鲁班猫监控检测 — [野火]嵌入式AI应用开发实战指南—基于LubanCat-RK系列板卡 文档 (embedfire.com) 一、简介 记录简单的摄像头监…...
[Django 0-1] Core.Serializers 模块
Core.Serializers 模块 Django 序列化模块 模块结构 . ├── __init__.py ├── base.py ├── json.py ├── jsonl.py ├── python.py ├── pyyaml.py └── xml_serializer.py1 directory, 7 files自定义序列化器 通过继承django.core.serializers.base.Serial…...

鸿蒙内核源码分析(用栈方式篇) | 程序运行场地谁提供的
精读内核源码就绕不过汇编语言,鸿蒙内核有6个汇编文件,读不懂它们就真的很难理解以下问题. 1.系统调用是如何实现的? 2.CPU是如何切换任务和进程上下文的? 3.硬件中断是如何处理的? 4.main函数到底是怎么来的? 5.开机最开始发生了什么? 6.关机…...

Linux 进程间通信之匿名管道
💓博主CSDN主页:麻辣韭菜💓 ⏩专栏分类:Linux知识分享⏪ 🚚代码仓库:Linux代码练习🚚 🌹关注我🫵带你学习更多Linux知识 🔝 目录 前言 一. 进程间通信介绍 1.进程间通…...
数据结构与算法学习笔记六--数组和广义表(C语言)
目录 前言 1.数组 1.定义 2.初始化 3.销毁 4.取值 5.设置值 6.完整代码 前言 这篇博客主要介绍数据结构中的数组和广义表的用法。 1.数组 在数据结构中,数组是一种线性数据结构,它由一组连续的相同类型的元素组成,每个元素都有一个唯…...
图搜索算法详解
图搜索算法详解 摘要: 图搜索算法是解决路径规划和网络分析问题的关键技术。本文将详细介绍图搜索算法的基本概念、分类以及常见的算法,如广度优先搜索(BFS)、深度优先搜索(DFS)、A*搜索等。同时ÿ…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

css实现圆环展示百分比,根据值动态展示所占比例
代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...

Golang——6、指针和结构体
指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)
一、OpenBCI_GUI 项目概述 (一)项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台,其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言,首次接触 OpenBCI 设备时,往…...