字符函数,字符串函数(C语言)

字符函数,字符串函数是C语言中非常重要的函数族,它们在日常的编程过程中被广泛使用。它们不仅能够大大提高我们的编程效率,还可以为我们提供更灵活、更高效的操作方法。在本篇博客中,我们将一起深入了解这二类函数的基本概念和使用方法。话不多说我们开始吧!(制作不易恳求三连)在这里插入图片描述

文章目录

  • 1,字符函数
    • 字符分类函数
    • 字符转换函数
  • 2,字符串函数
    • strlen
    • strcpy
    • strcat
    • strcmp
    • strncpy,strncat,strncmp
    • strstr
    • strtok
    • strerror
      • perror
  • 3,结尾

1,字符函数

字符分类函数

 正如它的名字,它的作用是用来做字符分类的,那包含那些呢?正如下图所示。

在这里插入图片描述
其中控制字符为ASCII值0-31和127。
图形字符为+,-,*,/,%,<,>,!,&,|,^,~,_,·,(,),[,],{,},?,:,;,,,",',#,\。
这些函数的头文件都是ctype.h,在使用时不要忘记加上。
这里每个函数的使用方法都差不多,只要学会一个其他的自然也都会使用,我来为大家演示一下比较常用的isdigit函数。

//输入一串字符串只输出其中的数字部分
#include<stdio.h>
#include<ctype.h>
int main()
{char ch[100] = { 0 };for (int i = 0; scanf("%c", &ch[i]) != EOF; i++){if (isdigit(ch[i]))//判断是否为数字0~9 如果是返回值为参数所表示数字不然为0printf("%c", ch[i]);}return 0;
}

运行结果如下。
在这里插入图片描述

字符转换函数

比较基本的字符转换函数有两个一个是 tolower 一个是 toupper。正如其英文直译过来一样,第一个可以把大写字母转换为小写字母,另一个则是把小写字母转化为大写字母。下面我简单来示范一下toupper函数的使用方式。

#include<stdio.h>
#include<ctype.h>
int main()
{char ch[] = "abcdef";for (int i = 0; i <= 6; i++){printf("%c",toupper(ch[i]));//把小写字母转化为大写字母其返回值为转化后字母的ASCII值所以可以直接打印其返回值}return 0;
}

在这里插入图片描述

tolower函数使用方法也类似可以比照着使用。

2,字符串函数

 字符串函数有许多个,使用他们需要带上string.h头文件,接下来我将以介绍,使用,模拟三个流程对每个字符串函数进行讲解。

strlen

介绍
在这里插入图片描述

相必大家对这个函数并不陌生,这个就是用来计算字符串长度的函数从起始位置开始直到遇见’\0’时停止统计中间的字符个数。如果所给字符串中没有‘\0’,则会产生一个随机值,因为strlen函数会继续沿着地址寻找‘\0’直到找到才停止。
使用

#include<stdio.h>
#include<string.h>
int main()
{char ch[] = "abcdef";printf("%zu", strlen(ch));//注意strlen的返回类型时无符号形整数return 0;
}

在这里插入图片描述
注意strlen函数的返回值是无符号形整数,再进行加减运算比大小时很容易出错。
模拟
我们可以以如下方式自己来模拟一下srlen函数来增加对其的理解。

size_t my_strlen(char* arr)//第一种写法统计\0之前的字符个数
{int len = 0;for (int i = 0; arr[i] != '\0'; i++){len++;}return len;
}
size_t my_strlen(char* arr)//第二种写法递归
{if(!(*arr))return 0;elsereturn 1+my_strlen(arr+1);
}
size_t my_strlen(char* arr)//第三种写法指针-指针=两指针(地址)间元素的个数
{char* a = arr;while(*arr != '\0')arr++;return arr - a;
}

strcpy

介绍
在这里插入图片描述
这个函数用于字符串的拷贝,上图中的source参数我们称之为源字符串,改函数中的作用是把源字符串中的内容拷贝到destination字符串(目的字符串)中(源字符串中的\0也会拷贝过去)。
需要注意的是目的字符串要足够容纳的下源字符串并且源字符串末尾一定要有\0。
使用

#include<stdio.h>
#include<string.h>
int main()
{char ch[] = "abcdef";char ch1[] = "fed";printf("%s", strcpy(ch,ch1));//现在ch中储存的字符为f,e,d,\0,e,f,\0所以只会打印fed,strcpy的返回值为目的字符串的首元素地址。return 0;
}

在这里插入图片描述
模拟

char* my_strcpy(char* arr,const char*arr2)
{char* ret = arr;//记录首元素地址while(*arr++=*arr2++)//当arr2为\0时结束循环,先使用再加。{;}return ret;

strcat

介绍
在这里插入图片描述
该函数可以再目的字符串的末尾的’\0’处追加上一段与源字符串一样的字符串。比如对hello\0和wolrd\0这两个字符串使用后会变成helloworld\0.
注意事项与strcpy类似,值得注意的还有目的字符串也许要以\0为结尾不然不知道在哪里开始追加。
使用

#include<stdio.h>
#include<string.h>
int main()
{char ch[10] = "abcdef";char ch1[] = "fed";printf("%s", strcat(ch,ch1));//返回值为目的字符串首元素的地址return 0;
}

在这里插入图片描述
模拟

char* my_strcat(char* arr, const char* arr2){char* ret = arr;while (*arr != '\0')//找到\0后停止{arr++;}while (*(arr++) = *(arr2++)){;}return ret;}

strcmp

介绍
在这里插入图片描述
该函数是用来对两个字符串来比较大小的,第⼀个字符串大于第二个字符串,则返回大于0的数字第⼀个字符串等于第二个字符串,则返回0 第⼀个字符串小于第二个字符串,则返回小于0的数字,我来举几个例子。
“abcd”“abcf” 比较方式是先从每个字符串的起点来比较a=a,b=b,c=c,d<f(d的ASCII值小于f的),所以第二个字符串大于第一个字符串。
“abc” “abcd” 当比较完c后发现第一个字符串没东西了所以自然第二个字符串大于第一个字符串。
“abcfef” “abfdef” 当比较到c<f时停止比较,字符串2大于字符串1。
使用

#include<stdio.h>
#include<string.h>
int main()
{char ch[10] = "abcdef";char ch1[] = "fed";int ret = strcmp(ch, ch1);if (ret < 0)printf("小于");else if (ret > 0)printf("大于");else printf("等于");return 0;
}

在这里插入图片描述
一定不要记错最初安比较是按位比较的.
模拟

int my_strcmp(const char* arr, const char* arr2){while (*arr == *arr2){if (*arr == '\0')return 0;//两字符串相等arr++;//进到下一位来比较arr2++;}if (*arr > *arr2)return 1;else if (*arr < *arr2)return -1;}

strncpy,strncat,strncmp

介绍
这三个函数与他们的不带n版本比较类似下面我来意义给大家介绍。
strncpy比着strcpy多了一个size_t类型的参数,用来表示拷贝字符的个数,拷贝n个字符从源字符串到目标空间。
如果源字符串的长度小于n,则拷贝完源字符串之后,在目标的后边追加、0,直到拷贝n次后结束。

同理strncat将源字符串的前n个字符追加到目的字符串末尾,再追加⼀个 \0 字符。如果源字符串的长度小于n的时候,只会将字符串中到\0 的内容追加到目的字符串末尾。

strncmp则是将源字符串与目的字符串前n个字符进行比较,比较出大小。
这三者的使用和模拟与原版差不多不再进行演示有兴趣的可以自己尝试。

strstr

介绍
char* strstr ( const char * str1, const char * str2);
这个函数的作用是在一个字符串中查找另外一个字符串,即在str1转向的字符串中查找str2指向的字符串。如果找到函数会返回所查找字符串在str1所指向的字符串中第一次出现的位置(不比较\0),如果找不到则会返回NULL。
使用

#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "w!wwr!,wwr,wwwwwwr";char arr2[] = "!,";printf("%p %p", strstr(arr, arr2), arr);//打印出所查找字符串所在的地址和arr的地址来对比return 0;
}

在这里插入图片描述
发现刚好差值为5说明所查找的字符串在arr中下标为5的地方可以找到。
模拟

char* my_strstr(const char* arr, const char* arr2)
{if (*arr2 == '\0')//如果arr2为空则直接返回ar首元素的地址return arr;while (*arr)//当*arr=\0时出循环{int flag = 0;char* ret = arr;//储存char* wwr = arr2;if (*arr == *arr2)//当元素相等时进入循环{while (*arr2)//当*arr2=\0时出循环{if (*arr != *arr2){flag = 1;arr = ret + 1;arr2 = wwr;break;}arr++;arr2++;}if (flag == 0)return ret;//找到了}elsearr = ret + 1;//没找到从arr的下一位开始查找}return NULL;
}

该流程为暴力解法,从arr的第一个元素开始查找看是否能找到arr2找不到则返回arr下一个元素继续查找,虽然能解决问题但是步骤繁琐,时间还长,这时我们就可以采用kmp算法来解决。(比较长以后再讲,有兴趣的可以去b站搜索学习一下)

strtok

介绍
char * strtok ( char * str, const char * sep)
假设有一个字符串“abc,bad。ckl、”我们想把这个字符串分成abc,bad,ckl这三个字符串,也就是说,。、这三个字符我们就可以把他们三个字符装进一个字符串中,然后将这个字符串的字符用strtok函数定义成分隔符sep,每当一个str指向的字符串中出现这三个字符之一就会以这个字符为切口一分为二变成两个字符串。
strtok函数找到str中的⼀个标记,strtok函数将保存它在字符串中的位置。并将其用 \0 结尾,返回⼀个指向这个标记的指针。
当strtok的第一个参数为NULL时,函数将在同一个字符串中上一次被保存的位置开始,查找下⼀个标记。 如果字符串中不存在更多的标记,则返回 NULL 指针。
注意strtok函数会改变被操作的字符串,在使用strtok函数切分的字符串⼀般要使用临时拷贝并且可修改的内容。
使用

#include<stdio.h>
#include<string.h>
int main()
{char arr[] = "w!wr,wwr,wwwwwwr";char arr2[] = "!,";//a为临时变量用来储存被分割的字符串。for(char * a= strtok(arr, arr2);a!=NULL;a= strtok(NULL, arr2))//一开始a= strtok(arr, arr2)可以得到第一次被分割后靠前的字符串,此时strtok已经保存了切割点的位置下一次只需要让a= strtok(NULL, arr2)即可找到上一次切割的地方再继续查找切割点,如果找不到了的话a就会等于NULL并退出循环。{printf("%s\n",a);}return 0;
}

在这里插入图片描述
结果显然arr被分成了四个字符串。
该函数模拟起来比较麻烦暂不展示。

strerror

介绍
char * strerror ( int errnum );
在c语言的标准库中规定了一些错误码,放在errno.h这个头文件中说明,在程序启动时会产生一个全局变量errno来记录程序当前的错误码一开始errno为0表示没有错位,一旦程序发生了某种错误就会产生对应的错误码存放在errno这个变量中,每个错误码都有对应的错误信息,strerror函数就可以将错误对应的错误信息字符串对应的的地址作为返回值,你可以根据返回的地址打印出错误信息。
使用
假如我们得到的错误码为1,那么我们就可以通过这个函数在找到错误码对应的错误信息字符串的地址。

   #include<stdio.h>
#include<string.h>
#include<errno.h>
int main()
{int i = 1;//错误码printf("%s", strerror(i));//找出错误信息的地址并打印字符串return 0;
}

在这里插入图片描述
输出的错误信息自然就是1这个错误码所对应的错误信息,还有许多其他的错误码吗,小伙伴们可以自己去尝试。

perror

那我们就不得不说说perror函数了。该函数可以直接打印出当前程序对应的错误码的错误信息。
也就是说printf(“%s”, strerror());这句话可以直接用perror();来代替。

3,结尾

想必看到这里,大家都对这两种函数有了一定程度掌握,一定不要忘了巩固练习,不然过一段时间都会忘记,希望大家都能够熟练掌握。
制作不易给个赞,收藏,关注吧!!!

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

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

相关文章

在外包待了6年,技术退步太明显......

先说情况&#xff0c;大专毕业&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近6年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试&#xf…

关于队列的简单理解

1.队列(Queue) 1.1 关于队列 队列 &#xff1a;只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表&#xff0c; 队列具有先进先出 FIFO(First In First Out)的操作特性&#xff08;队列是个接口&#xff09;&#xff1b; 入队列&#x…

外包干了2个月,技术倒退2年。。。

先说一下自己的情况&#xff0c;本科生&#xff0c;20年通过校招进入深圳某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年国庆&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

图书馆智能密集书架怎么用的

图书馆智能密集书架是一种高密度存储书籍的设备&#xff0c;通过机器控制和操作&#xff0c;实现了对书籍的高效存储和检索。使用专久智能智能密集书架的方法如下&#xff1a; 1.先进行授权认证&#xff0c;确认身份和权限&#xff0c;进行操作前要确保权限正确&#xff0c;以免…

日志JavaAgent-NoClassDefFoundError

一、引言 组内最近做了一个日志公共组件&#xff0c;用的是javaagent的方式&#xff0c;之前搞的maven jar包每次都要把所有系统都发一遍&#xff0c;太麻烦。 javaagent通过Java虚拟机&#xff08;JVM&#xff09;的Instrumentation API来实现代码的侵入。通过Instrumentation…

GNN Maximum Flow Problem (From Shusen Wang)

Maximum Flow Problem ShusenWang 图数据结构和算法课程笔记 Slides Maximum Flow Problem Description Naive Algorithm Residual Capacity - FlowLeft: Original GraphRight: Residual Graph - Bottleneck capacity 2- Iteration 2:- Find an augmenting path: s -&g…

HTTP会话技术---Cookie、Session和Token介绍及它们在JavaWeb中的使用

当涉及到Web应用程序的身份验证和状态管理时&#xff0c;我们通常会使用到Cookie、Session和Token这些会话技术。下面是对它们的介绍&#xff0c;并在JavaWeb中的示例 Cookie&#xff08;HTTP Cookie&#xff09; Cookie是一种存储在用户浏览器中的小型文本文件&#xff0c;由…

基于Springboot的在线问卷调查系统(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的在线问卷调查系统(有报告)。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring…

1-4节电池升降压充电IC解决方案

描述 MP2760是一款集成窄电压DC&#xff08;NVDC&#xff09;电源路径管理功能和USB On-the-Go(OTG)功能的升降压充电IC&#xff0c;兼容USB PD&#xff0c;适用于单节至4节串联的电池包应用。该芯片的充电输入电压范围广&#xff0c;可支持最高22V。 当启用电池放电模式&…

深入学习Synchronized各种使用方法

文章目录 前言一、synchronized关键字通用在下面四个地方&#xff1a;1.1synchronized修饰实例方法1.2synchronized修饰静态方法&#xff1a;1.3synchronized修饰实例方法的代码块1.4synchronized修饰静态方法的代码块2.读入数据 二.Sychronized关键特性2.1互斥2.2 刷新内存2.3…

CentOS 7 虚拟机java项目部署tomcat

首先安装java环境 下载安装包:jdk-19_linux-x64_bin.tar.gz_免费高速下载|百度网盘-分享无限制 (baidu.com) 将安装包上传到虚拟机 解压 tar zxvf jdk-19_linux-x64_bin.tar.gz 移动文件到 mv jdk-19.0.1 /usr/jdk-19.0.1 编辑配置文件 vim /etc/profile export JAVA…

解决cad找不到msvcr100.dll的有效方法,完美修复dll问题

在计算机使用过程中&#xff0c;我们经常会遇到一些错误提示&#xff0c;其中之一就是由于找不到msvcr100.dll文件而导致CAD软件无法正常运行的情况&#xff0c;系统无法找到所需的动态链接库文件。但是通过一些简单的解决方法&#xff0c;我们可以快速解决这个问题并继续我们的…

【动态规划】LeetCode-62.不同路径

&#x1f388;算法那些事专栏说明&#xff1a;这是一个记录刷题日常的专栏&#xff0c;每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目&#xff0c;在这立下Flag&#x1f6a9; &#x1f3e0;个人主页&#xff1a;Jammingpro &#x1f4d5;专栏链接&…

HNU-计算机网络-讨论课2

第二次 有关网络智能、安全以及未来网络的讨论 一、必选问题&#xff08;每组自由选择N个&#xff0c;保证组内每人负责1个&#xff09; 网络的发展促进信息的传播&#xff0c;极大提高了人类的感知能力&#xff0c;整个世界都被纳入人类的感知范围。但人们对信息系统以及数据…

手持式安卓主板_PDA安卓板_智能手持终端方案

手持式安卓主板方案是一种智能终端设备&#xff0c;具备自动对焦和闪光灯功能&#xff0c;可以在昏暗的环境下快速扫描二维码并轻松采集数据。该方案还提供多渠道支付和数据采集功能&#xff0c;为用户提供了便捷的体验。 该方案的产品基于手持式安卓主板&#xff0c;并搭载了八…

C/C++,图算法——求强联通的Tarjan算法之源程序

1 文本格式 #include <bits/stdc.h> using namespace std; const int maxn 1e4 5; const int maxk 5005; int n, k; int id[maxn][5]; char s[maxn][5][5], ans[maxk]; bool vis[maxn]; struct Edge { int v, nxt; } e[maxn * 100]; int head[maxn], tot 1; vo…

Unity UGUI控件之Horizontal Layout Group

Horizontal Layout Group是Unity中的UGUI控件&#xff0c;用于在水平方向上对子对象进行布局。 主要有一下作用&#xff1a; 水平布局&#xff1a;Horizontal Layout Group将子对象按照水平方向进行布局&#xff0c;可以控制子对象的排列顺序和间距。自动调整尺寸&#xff1a…

不到1000行代码,PyTorch团队让Llama 7B提速10倍

在过去的一年里&#xff0c;生成式 AI 发展迅猛&#xff0c;在这当中&#xff0c;文本生成一直是一个特别受欢迎的领域&#xff0c;很多开源项目如 llama.cpp、vLLM 、 MLC-LLM 等&#xff0c;为了取得更好的效果&#xff0c;都在进行不停的优化。 作为机器学习社区中最受欢迎框…

面试就是这么简单,offer拿到手软(四)—— 常见java152道基础面试题

面试就是这么简单&#xff0c;offer拿到手软&#xff08;一&#xff09;—— 常见非技术问题回答思路 面试就是这么简单&#xff0c;offer拿到手软&#xff08;二&#xff09;—— 常见65道非技术面试问题 面试就是这么简单&#xff0c;offer拿到手软&#xff08;三&#xff…

WIN10下解决HIVE 初始化MYSQL表报错:Unknown version specified for initialization

今天本地WINDOWS装HIVE&#xff0c;走到最后一步初始化数据库死活不通过&#xff1a; D:\hive\hive-rel-release-3.1.3\bin\ext>hive --service schematool -dbType mysql -initSchema --verbose SLF4J: Class path contains multiple SLF4J bindings. SLF4J: Found bind…