【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语言中有所帮助!

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

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

相关文章

哪个品牌的骨传导耳机好用?精选五大高性能热门骨传导耳机款式推荐!

我作为一名热衷于音乐的数码博主&#xff0c;在选购产品前也习惯于先浏览各种榜单。最近&#xff0c;我发现关于骨传导耳机的讨论热度极高&#xff0c;有人认为骨传导耳机是非常值得入手的新型蓝牙耳机&#xff0c;也有人认为骨传导耳机只是智商税的产品。经过深入调查后&#…

jetbra.zip教程 激活JetBrains全家桶Idea、pyCharm…亲测有效

本教程基于Windows系统 1、下载jetbra.zip 1.1、地址&#xff1a;https://3.jetbra.in/ 1.2、点击随便一个可用站点 1.3、找到左上角蓝色部分&#xff0c;点击下载 1.4、注意软件卡片上右上角支持的版本 1.5、不要关闭网页&#xff0c;留着&#xff0c;要等会用到 2、下载对应…

器件配置比特流或 PDI 设置-7 系列比特流设置

7 系列比特流设置 下表所示 7 系列器件的器件配置设置可搭配 set_property <Setting> <Value> [current_design] Vivado 工具 Tcl 命令一起使用。 注释 &#xff1a; BPI 的比特流设置对于 Spartan -7 器件无效。

自定义数据上的YOLOv9分割训练

原文地址&#xff1a;yolov9-segmentation-training-on-custom-data 2024 年 4 月 16 日 在飞速发展的计算机视觉领域&#xff0c;物体分割在从图像中提取有意义的信息方面起着举足轻重的作用。在众多分割算法中&#xff0c;YOLOv9 是一种稳健且适应性强的解决方案&#xff0…

c++ BSTree二叉搜索树(附原码)

目录 一、概念 二、基本操作 1、插入 2、中序遍历 3、删除 4、查找 5、总结删除 三、应用场景 四、原码 一、概念 左子树比根小&#xff0c;右子树比根大 意义&#xff1a;最多查找高度次数 不需要排序&#xff0c;就达到了二分查找的效率 同时还弥补了单纯数组的插入…

自适应调节Q和R的自适应UKF(AUKF_QR)的MATLAB程序

简述 基于三维模型的UKF&#xff0c;设计一段时间的输入状态误差较大&#xff0c;此时通过对比预测的状态值与观测值的残差&#xff0c;在相应的情况下自适应调节系统协方差Q和观测协方差R&#xff0c;构成自适应无迹卡尔曼滤波&#xff08;AUKF&#xff09;&#xff0c;与传统…

【分布式 | 第五篇】何为分布式?分布式锁?和微服务关系?

文章目录 5.何为分布式&#xff1f;分布式锁&#xff1f;和微服务关系&#xff1f;5.1何为分布式&#xff1f;5.1.1定义5.1.2例子5.1.3优缺点&#xff08;1&#xff09;优点&#xff08;2&#xff09;缺点 5.2何为分布式锁&#xff1f;5.2.1定义5.2.2必要性 5.3区分分布式和微服…

zookeeper启动 FAILED TO START

注意&#xff1a;启动zookeeper时&#xff0c;需要使用zkServer.sh start命令将所有主机启动后&#xff0c;再查看状态 如果&#xff0c;启动一台主机&#xff0c;查看当前主机状态&#xff0c;则会报错 如果出错&#xff0c;进入到$ZOOKEEPER_HOME/logs&#xff0c;查看日志 …

LabVIEW智能变电站监控系统设计与实现

LabVIEW智能变电站监控系统设计与实现 随着电力系统和智能化技术的快速发展&#xff0c;建立一个高效、可靠的变电站监控系统显得尤为重要。通过分析变电站监控系统的需求&#xff0c;设计了一个基于LabVIEW软件的监控平台。该平台利用虚拟仪器技术、传感器技术和无线传输技术…

Nginx rewrite项目练习

Nginx rewrite练习 1、访问ip/xcz&#xff0c;返回400状态码&#xff0c;要求用rewrite匹配/xcz a、访问/xcz返回400 b、访问/hello时正常访问xcz.html页面server {listen 192.168.99.137:80;server_name 192.168.99.137;charset utf-8;root /var/www/html;location / {root …

【论文阅读:Towards Efficient Data Valuation Based on the Shapley Value】

基于Shapley值的高校数据价值评估 主要贡献 提出了一系列用于近似计算Shapley值的高效算法。设计了一个算法&#xff0c;通过实现不同模型评估之间的适当信息共享来实现这一目标,该算法具有可证明的误差保证来近似N个数据点的SV&#xff0c;其模型评估数量为 O ( N l o g ( N…

EPICS DataBase详解

1、分布式EPICS设置 1&#xff09; 操作界面&#xff1a;包括shell命令行方式(caget, caput, camonitor等)和图形界面方式(medm, edm, css等)。 2&#xff09;输入输出控制器(IOC) 2、IOC 1) 数据库&#xff1a;数据流&#xff0c;基本上周期运行 2)sequencer&#xff1a;基…

插入法(直接/二分/希尔)

//稳定耗时&#xff1a; 双向冒泡&#xff0c;可指定最大最小值个数MaxMinNum<nsizeof(Arr)/sizeof(Arr[0]), void BiBubbleSort(int Arr[],int n&#xff0c;int MaxMinNum){int left0,rightn-1;int i;bool notDone true;int temp;int minPos;while(left<right&&am…

图像处理--空域滤波增强(原理)

一、均值滤波 线性滤波算法&#xff0c;采用的主要是邻域平均法。基本思想是使用几个像素灰度的某种平均值来代替一个原来像素的灰度值。可以新建一个MN的窗口以为中心&#xff0c;这个窗口S就是的邻域。假设新的新的像素灰度值为&#xff0c;则计算公式为 1.1 简单平均法 就是…

LeetCode 234.回文链表

题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为 回文链表 。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,2,1] 输出&#xff1a;true示例 2&#xff1a; 输入&#xff…

PWN入门之Stack Overflow

Stack Overflow是一种程序的运行时&#xff08;runtime&#xff09;错误&#xff0c;中文翻译过来叫做“栈溢出”。栈溢出原理是指程序向栈中的某个变量中写入的字节数超过了这个变量本身所申请的字节数&#xff0c;导致与其相邻的栈中的变量值被改变。 在本篇文章中&#xff…

常用语音识别开源四大工具:Kaldi,PaddleSpeech,WeNet,EspNet

无论是基于成本效益还是社区支持&#xff0c;我都坚决认为开源才是推动一切应用的动力源泉。下面推荐语音识别开源工具&#xff1a;Kaldi&#xff0c;Paddle&#xff0c;WeNet&#xff0c;EspNet。 1、最成熟的Kaldi 一个广受欢迎的开源语音识别工具&#xff0c;由Daniel Pove…

代码随想录算法训练营DAY54|C++动态规划Part15|647.回文子串、516最长回文子序列、

文章目录 647.回文子串思路CPP代码双指针 516最长回文子序列思路CPP代码 动态规划总结篇 647.回文子串 力扣题目链接 文章链接&#xff1a;647.回文子串 视频链接&#xff1a;动态规划&#xff0c;字符串性质决定了DP数组的定义 | LeetCode&#xff1a;647.回文子串 其实子串问…

第07-6章 应用层详解

HTTP、SSL&#xff1a;基于TCP&#xff0c;HTTP端口:80、HTTPS&#xff08;加密&#xff09;端口&#xff1a;443&#xff1b;FTP:基于TCP&#xff0c;两类端口&#xff1a;21、20&#xff08;数据传输之前需要建立连接此时是21&#xff0c;真正传输数据时用20&#xff09;TFTP…

机器学习中线性回归算法的推导过程

线性回归是机器学习中监督学习中最基础也是最常用的一种算法。 背景&#xff1a;当我们拿到一堆数据。这堆数据里有参数&#xff0c;有标签。我们将这些数据在坐标系中标出。我们会考虑这些数据是否具有线性关系。简单来说 我们是否可以使用一条线或者一个平面去拟合这些数据的…