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

【C语言】解决不同场景字符串问题:巧妙运用字符串函数

请添加图片描述

请添加图片描述
Alt

🌈个人主页:是店小二呀
🌈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;
}

【说明】:

  1. 第一个参数不为NULL,则函数找到str1的第一个标记并且记录当下标记的位置
  2. 第一个参数为NULL,则从标记的位置,出发寻找下一个标记位置
  3. 如果字符串中找不到更多的标记,则返回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语言】解决不同场景字符串问题:巧妙运用字符串函数

&#x1f308;个人主页&#xff1a;是店小二呀 &#x1f308;C语言笔记专栏&#xff1a;C语言笔记 &#x1f308;C笔记专栏&#xff1a; C笔记 &#x1f308;喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、字符函数1.1 字符分类函数1.1.1 islower1.1.2 isupper 1.…...

android 如何显示网络地址对应的图片

1.android 如何显示网络地址对应的图片 在Android中显示网络地址对应的图片&#xff0c;通常有多种方法可以实现。以下是几种常见的方法&#xff1a; 1. 使用ImageView和Picasso库 Picasso是一个强大的图片加载库&#xff0c;它可以方便地加载网络图片并显示到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课程分类表的结构 这张表是一个树型结构&#xff0c;通过父结点id将各元素组成一个树。 利用mybatis-plus-gen…...

Android SQLite中的UNIQUE constraint failed错误

报错信息&#xff1a; UNIQUE constraint failed SQLite中的UNIQUE constraint failed错误&#xff0c;表明尝试插入或更新数据库时出现了违反唯一性约束的情况。唯一性约束确保在特定列或列集合中的值在表中是唯一的&#xff0c;即不能有重复的值。当你尝试插入或更新已存在于…...

嘴尚绝卤味:传承经典,缔造美食新风尚

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

Docker 入门与实践:从零开始构建容器化应用环境

Docker 一、docker常用命令docker ps 格式化输出Linux设置命令别名 二、数据卷相关命令挂载到默认目录&#xff08;/var/lib/docker&#xff09;挂载到本地目录 三、自定义镜像Dockerfile构建镜像的命令 四、网络自定义网络 五、DockerCompose相关命令 一、docker常用命令 dock…...

C# 用户控件UserControl事件解绑资源释放

用户控件继承子 UserControl 。 现在有个业务需求在UserControl 所在的窗体关闭时解除事件HMouseDown绑定。 因没有相关的Close事件。后来本人想了一个办法在 ROICtlDesigner类的 Dispose 方法中执行相关的释放代码 比如解除事件绑定 释放资源 public partial class ROICt…...

QT-QTCreator环境配置

准备工作&#xff1a; 下载QT: 链接&#xff1a;https://pan.baidu.com/s/1prJcsC4DGqhKiXvLuPQFVA?pwd60b3 提取码&#xff1a;60b3下载WindowsKits&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1QNiS3HpbH5M5kXx5AhkqnQ?pwde2h8 提取码&#xff1a;e2h8安装的…...

最大连续和

【问题描述】 对于一个具有n个元素的整型数组 a&#xff0c;求具有最大连续和的子数组&#xff08;最少具有一个元素&#xff09;。 【输入形式】 输入的第一行为一个整数 n&#xff0c;接下来的一行为 n 个整数&#xff0c;表示数组的元素。 【输出形式】 输出具有最大连续和的…...

分布式系统事务一致性解决方案(基于事务消息)

参考&#xff1a;https://rocketmq.apache.org/zh/docs/featureBehavior/04transactionmessage/ 文章目录 概要错误的方案方案一&#xff1a;业务方自己实现方案二&#xff1a;RocketMQ 事务消息什么是事务消息事务消息处理流程事务消息生命周期使用限制使用示例使用建议 概要 …...

Unity Animation--动画剪辑

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

如何将 redis 快速部署为 docker 容器?

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

iOS - Undefined symbols: 解决方法

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

优化理论复习——(三)

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

RK3568笔记二十四:基于Flask的网页监控系统

若该文为原创文章&#xff0c;转载请注明原文出处。 此实验参考 《鲁班猫监控检测》&#xff0c;原代码有点BUG&#xff0c;已经下载不了。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…...

鸿蒙内核源码分析(用栈方式篇) | 程序运行场地谁提供的

精读内核源码就绕不过汇编语言&#xff0c;鸿蒙内核有6个汇编文件&#xff0c;读不懂它们就真的很难理解以下问题. 1.系统调用是如何实现的? 2.CPU是如何切换任务和进程上下文的? 3.硬件中断是如何处理的? 4.main函数到底是怎么来的? 5.开机最开始发生了什么? 6.关机…...

Linux 进程间通信之匿名管道

&#x1f493;博主CSDN主页:麻辣韭菜&#x1f493;   ⏩专栏分类&#xff1a;Linux知识分享⏪   &#x1f69a;代码仓库:Linux代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d; 目录 前言 一. 进程间通信介绍 1.进程间通…...

数据结构与算法学习笔记六--数组和广义表(C语言)

目录 前言 1.数组 1.定义 2.初始化 3.销毁 4.取值 5.设置值 6.完整代码 前言 这篇博客主要介绍数据结构中的数组和广义表的用法。 1.数组 在数据结构中&#xff0c;数组是一种线性数据结构&#xff0c;它由一组连续的相同类型的元素组成&#xff0c;每个元素都有一个唯…...

图搜索算法详解

图搜索算法详解 摘要&#xff1a; 图搜索算法是解决路径规划和网络分析问题的关键技术。本文将详细介绍图搜索算法的基本概念、分类以及常见的算法&#xff0c;如广度优先搜索&#xff08;BFS&#xff09;、深度优先搜索&#xff08;DFS&#xff09;、A*搜索等。同时&#xff…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验

一、多模态商品数据接口的技术架构 &#xff08;一&#xff09;多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如&#xff0c;当用户上传一张“蓝色连衣裙”的图片时&#xff0c;接口可自动提取图像中的颜色&#xff08;RGB值&…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...