C语言字符串处理函数库

article/2025/5/2 15:33:42

C语言的字符串处理函数库包括复制函数、拼接函数、比较函数、搜索函数等,这些函数的声明都位于头文件<string.h>。使用这些函数时,需要使用#include<string.h>指令将头文件包含到文件中。

复制函数

复制函数的功能是将字符(节)从内存的一处(源)移动到另一处(目的),包括以下几个函数:

void *memcpy(void *s1, const void *s2, size_t n);
void *memmove(void *s1, const void *s2, size_t n);
char *strcpy(char *s1, const char *s2);
char *strncpy(char *s1, const char *s2, size_t n);

上述函数的第一个参数都为复制的目的,而第二个参数都为复制的源。

memcpy函数从字节数组s2s1复制n个字节。如果源和目的有重叠,那么使用memcpy会有问题。memmove函数可以在源和目的重合时正常处理,在其他方面与memcpy相同。

strcpy将一个以空字符结尾的字符串s2复制给s1strncpystrcpy一样,只不过它限制了复制的字符的个数,最多复制n个字符。如果n过小,那么strncpy就不能复制末尾的空字符,如果n比源字符串长度大,strncpy在遇到空字符后会不断向目的字符串追加空字符,直到达到n个。同时strcpystrncpy在源和目的重叠时也会有问题的。

memcpymemmovestrncpy函数可用于包括字符在内的任何内存块,而strcpy函数只适合字符串,它会持续复制字符,直到遇到源字符中的空字符为止。

/*************************************** string_copy_function.c             **                                    ** C语言字符串处理函数库中的复制函数  ***************************************/#include <stdio.h>
#include <string.h>#define PRINT(dest, i, n) for(i = 0; i < n; i++) printf("%c, ", dest[i]);int main()
{char source[] = {'h', 'o', 't', '\0', 't', 'e', 'a'};char dest[7];memcpy(dest, source, 3);int i = 0;PRINT(dest,i,7);printf("\n");memcpy(dest, source, 4);PRINT(dest,i,7);printf("\n");memcpy(dest, source, 7);PRINT(dest,i,7);printf("\n");memset(dest, '\0', sizeof(dest));memmove(dest, source, 3);PRINT(dest,i,7);printf("\n");memmove(dest, source, 4);PRINT(dest,i,7);printf("\n");memmove(dest, source, 7);PRINT(dest,i,7);printf("\n");memset(dest, '\0', sizeof(dest));strcpy(dest, source);PRINT(dest,i,7);printf("\n");memset(dest, '\0', sizeof(dest));strncpy(dest, source, 3);PRINT(dest,i,7);printf("\n");strncpy(dest, source, 4);PRINT(dest,i,7);printf("\n");strncpy(dest, source, 7);PRINT(dest,i,7);printf("\n");return 0;
}

字符串复制函数

拼接函数

拼接函数包括以下两个函数:

char *strcat(char *s1, const char *s2);
char *strncat(char *s1, const char *s2, size_t n);

strcat函数将它的第二个参数s2追加到第一个参数s1的末尾。s1s2必须都是以空字符结尾的字符串。strcat会用s2的第一个字符覆盖s1的空字符,并在拼接字符串的后边添加空字符。strncatstrcat功能相同,只是限制了从s2中取出拼接到s1的字符个数。

/*************************************** string_cat_function.c              **                                    ** C语言字符串处理函数库的拼接函数    ***************************************/#include <stdio.h>
#include <string.h>int main()
{char str[7] = "tea";puts(str);strcat(str, "bag");puts(str);char str1[7]= "tea";strncat(str1, "bag", 2);puts(str1);char str2[7] = "tea";strncat(str2, "bag", 3);puts(str2);char str3[7] = "tea";strncat(str3, "bag", 4);puts(str3);return 0;
}

字符串处理函数

比较函数

比较函数包括以下几种:

int memcmp(const void *s1, const void *s2, size_t n);
int strcmp(const char *s1, const char *s2);
int strncmp(const char *s1, const char *s2, size_t n);
int strcoll(const char *s1, const char *s2);
size_t strxfrm(char *s1, const char *s2, size_t n);

memcmpstrcmpstrncmp函数以指向字符(字节)数组的指针为参数,逐个比较两个字符(字节)数组的每个字符。根据比较结束时第一个字符(字节)数组中的字符(字节)是小于、等于或大于第二个字符(字节)数组中的字符(字节)而返回-1,0或1。三个函数的主要区别是在于何时结束比较,如果第一个不同的字符在memcmpstrncmp的范围n之内,则三者相同。否则,strcmp在遇到空字符停止比较,memcmp不关心空字符,在比较的字节数达到n个时停止比较,strncmp结合了上述两个函数的特点,在达到n个字符或遇到空字符时停止比较。

strcrollstrcmp功能相似,只不过比较结果依赖于本地化设置(根据不同的地点比较结果不同)。然而strcoll函数的速度不是很快,当这是个问题或者希望在改变本地设置而不影响比较结果的话,可以使用strxfrm函数,strxfrm将第二个参数进行本地化转换,并将转换结果放在第一个参数,参数n限制了转换的字符个数。

/**************************************** string_cmp_function.c               **                                     ** C语言字符串处理函数库的比较函数     ****************************************/#include <stdio.h>
#include <string.h>
#include <stdlib.h>int main()
{char s1[] = {'b', 'i', 'g', '\0', 'c', 'a', 'r'};char s2[] = {'b', 'i', 'g', '\0', 'c', 'a', 't'};if (memcmp(s1, s2, 3) == 0)printf("memcmp(3): s1和s2的前%d个字符相同\n", 3);elseprintf("memcmp(3): s1和s2的前%d个字符不完全相同\n", 3);if (memcmp(s1, s2, 4) == 0)printf("memcmp(4): s1和s2的前%d个字符相同\n", 4);elseprintf("memcmp(4): s1和s2的前%d个字符不完全相同\n", 4);if (memcmp(s1, s2, 7) == 0)printf("memcmp(7): s1和s2的前%d个字符相同\n", 7);elseprintf("memcmp(7): s1和s2的前%d个字符不完全相同\n", 7);if (strcmp(s1, s2) == 0)printf("strcmp: s1和s2字符串相同\n");elseprintf("strcmp: s1和s2字符串不同\n");if (strncmp(s1, s2, 3) == 0)printf("strncmp(%d): s1和s2字符串相同\n", 3);elseprintf("strncmp(%d): s1和s2字符串不相同\n", 3);if (strncmp(s1, s2, 4) == 0)printf("strncmp(%d): s1和s2字符串相同\n", 4);elseprintf("strncmp(%d): s1和s2字符串不同\n", 4);if (strncmp(s1, s2, 7) == 0)printf("strncmp(%d): s1和s2字符串相同\n", 7);elseprintf("strncmp(%d): s1和s2字符串不同\n", 7);if (strcoll(s1, s2) == 0)printf("strcoll: s1和s2字符串相同\n");elseprintf("strcoll: s1和s2字符串不同\n");char original[] = "HelloWorld";printf("original: %s\n", original);size_t len = strxfrm(NULL, original, 0);char *transformed = malloc(len + 1);strxfrm(transformed, original, len);printf("transformed: %s\n", transformed);return 0;
}

字符串比较函数

搜索函数

搜索函数包括以下几个:

void *memchr(const void *s, int c, size_t n);
char *strchr(const char *s, int c);
char *strrchr(const char *s, int c);
char *strpbrk(const char *s1, const char *s2);
size_t strcspn(const char *s1, const char *s2); 
size_t strspn(const char *s1, const char *s2);
char *strstr(const char *s1, const char *s2);
char *strtok(char *s1, const char *s2);

strchr函数在字符串s中搜索字符c,它会返回一个指向s中第一个字符c的指针,如果没找到,则返回空指针。当遇到空字符时停止搜索。
memchr函数在搜索了n个字符后停止搜索,返回第一个字符c的指针,若未找到,则返回空指针。
strrchrstrchr类似,只是从字符串s的空字符开始,反向搜索字符c。如果找到,则返回反向第一个字符c的地址,若未找到返回空指针。
strpbrk函数从s1中寻找与s2中任意一个字符匹配的第一个字符,并返回指向它的指针。若找不到,则返回空。
strspn函数从字符串s1中搜索字符集s2,并返回字符组中第一个不属于给定字符集中的字符的下标,而strcspn函数返回第一个属于给定字符集中的字符的下标。
strstr函数在字符串s1中搜索字符串s2,返回找到的第一处匹配子串的指针,如果找不到,则返回空。
strtok函数在s1中搜索,查找一个非空字符序列(称作记号),这个序列不包括s2中指定的字符。将找到的记号后面的那个字符替换为一个空字符标记该记号的末尾,然后返回一个指向该记号的首字符的指针。使用strtok(NULL,s2)就可以继续上一次的strtok函数调用,直到其返回一个空指针为止。

/*************************************** string_search_function.c           **                                    ** C语言字符串函数库的搜索函数        ***************************************/#include <stdio.h>
#include <string.h>
#include <stddef.h>int main()
{char *p = NULL;char str[] = "Form follows functions";p = strchr(str, 'f');int index = -1;if (p != NULL){index = p - str;printf("f字符第一次出现在第%u个字符\n", (unsigned int)(index));}p = strchr(p + 1, 'f');if (p != NULL){index = p - str;printf("f字符第二次出现在第%u个字符\n", (unsigned int)(index));}p = memchr(str,'f', 5);if (p == NULL)printf("字符串的前5个字符没有字符'f'\n");p = strrchr(str, 'f');if (p != NULL){index = p - str;printf("f字符反向第一次出现在第%u个字符\n", (unsigned int)(index));}p = strpbrk(str, "mn");if (p != NULL){index = p - str;printf("m或n第一次出现的位置为%u,字符为%c\n", (unsigned int)index, *p);}int index2 = strspn(str, "mn");if (index >= 0)printf("第一个既不是m也不是n的字符位置为%d\n", index2);index2 = strcspn(str, "mn");if (index2 >= 0)printf("第一个m或n出现的字符位置为%d,为字符%c\n", index2, str[index2]);char day[] = "April 28, 1998";p = strtok(day, " ");printf("month: %s,", p);p = strtok(NULL,", ");printf("day: %s,", p);p = strtok(NULL, " ");printf("year: %s\n", p);return 0;
}

字符串搜索函数

其他函数

memset函数将一个字符的多个副本存储到指定的内存区域,其原型为:

void *memset(void *s, int c, size_t n);

strlen返回字符串的长度,不包括字符串末尾的空字符,其原型为

size_t strlen(const char *s);

strerror当输入存储在errno的错误码时,会返回一个指向描述这种错误的字符串的指针。其原型为

char *strerror(int errnum);
/*************************************** string_other_function.c            **                                    ** C语言字符串处理函数中的其他函数    **************************************/#include <stdio.h>
#include <string.h>
#include <math.h>
#include <errno.h>int main()
{int a[10] = {1,2,3,4,5,6,7,8,9,10};int i = 0;for (; i < 10; i++)printf("%d ", a[i]);printf("\n");memset(a, 0, sizeof(a));for (i = 0; i < 10; i++)printf("%d ", a[i]);printf("\n");char temp[] = "hello world";printf("temp字符数: %u\n",(unsigned)strlen(temp));printf("temp: %s\n", temp);memset(temp, '\0', sizeof(temp));printf("temp: %s\n", temp);sqrt(-1);puts(strerror(errno));return 0;
}

其他字符串处理函数

参考文献

  1. K.N. King 著,吕秀峰 译. C语言程序设计-现代方法. 人民邮电出版社

http://chatgpt.dhexx.cn/article/P6oQ9FrL.shtml

相关文章

C语言数学函数库

数学函数库 几乎所有语言都会提供数学函数库&#xff0c;数学函数库起码包含幂&#xff0c;对数、三角函数等最基本的运算&#xff0c;C对于基本数学函数还算全面&#xff0c;如下表&#xff1a; 使用数学函数库需要导入math.h&#xff0c;表中所有参数和返回值都是double&am…

c语言常用库函数

c语言常用库函数 1、数学函数 abs 原型&#xff1a;extern int abs(int x); 功能&#xff1a;求整数x的绝对值 说明&#xff1a;计算|x|, 当x不为负时返回x&#xff0c;否则返回-xfabs 原型&#xff1a;extern float fabs(float x); 功能&#xff1a;求浮点数x的绝对值 说明&…

简单实现破解Root密码

破解步骤&#xff1a; 在系统启动时进入grub选项菜单 在grub选项菜单按e进入编辑模式 编辑kernel那行 添加 /init 1 &#xff0c;相当于告诉linux下次启动启用单用户模式这个特殊模式启动。 按b重启 进入系统后&#xff0c;将root密码设置为空密码。 #vim /etc/passwd …

vue-admin-beautiful-pro源码、vue admin pro、vue admin plus 基于element-plus的vue3.0 admin前端框架

Vue Admin Plus已拥有四种布局&#xff08;画廊布局、综合布局、纵向布局、横向布局&#xff09;四种主题&#xff08;默认、海洋之心、绿茵草场&#xff0c;荣耀典藏&#xff09;&#xff0c;共计16布局主题种组合&#xff0c;满足所有项目场景&#xff0c;已支持常规bug自动修…

【Mockplus教程】安装Mockplus

MAC上安装Mockplus 1 下载 进入摩客官网桌面端下载页面&#xff0c;选择MAC版本下载&#xff1b; 2 安装 下载完成后&#xff0c;打开dmg包&#xff0c;将Mockplus图标拖动到Applications快捷图标上面即可完成安装。 整个过程见下方视频&#xff1a; 进入摩客官网桌面端下载页面…

VUE 使用 mock

mock使用背景 实际开发采用前后端分离形式&#xff0c;意味着后端API正在开发中&#xff0c;前端只需知道需要的数据格式即可进行开发&#xff0c;与后端开发同步进行。mock模拟后端提供api的调用&#xff0c;并返回数据。 mock使用步骤 1. 安装依赖 npm install mockjs 2…

抱歉,Xposed真的可以为所欲为——5.我自己刷的Xposed凭什么不给我用

抱歉&#xff0c;Xposed真的可以为所欲为——5.我自己刷的Xposed凭什么不给我用 标签&#xff1a; 2018 一句话概括本文 分析定位排查下厨房APP检测手机是否安装了Xposed框架的方法&#xff0c;然后一步步 Hook掉对应代码&#xff0c;以此去掉恶心的重复弹出警告对话框。 引…

2022最新 vue中mock的使用步骤 亲测可用

第一步&#xff1a;在src目录下创建文件夹mock&#xff0c;mock下创建文件index.js存放mock数据 index.js代码&#xff1a; import Mock from "mockjs" // const chartData { // "Msg": "success", // "ResCode": 200, // …

Mock 使用方式 + 在 Vue 项目中使用 Mock

Mock Mock 介绍搭建测试项目mock.js 模拟数据的基础使用方式Vue 项目中使用 mock.js 拦截数据后端接口写好后&#xff0c;mock.js 的移除处理 写下博客用于自我复习、总结。 如有错误之处&#xff0c;请各位大佬指出。 学习资料来源于&#xff1a;尚硅谷 Mock 介绍 在前后端开…

尚硅谷Vue2.0+Vue3.0全套教程视频笔记 + 代码 [P051-100]

视频链接&#xff1a;尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通_哔哩哔哩_bilibili P1-50&#xff1a;尚硅谷Vue2.0Vue3.0全套教程视频笔记 代码 [P001-050]_小白桶子的博客-CSDN博客 P51-100&#xff1a;当前页面 P101-135&#xff1a;尚硅谷Vue2.0Vue3.0全套教程视频…

VirtualXposed 免ROOT使用Xposed模块

免ROOT使用Xposed模块 一&#xff0c;下载工具 VirtualXposed 官网地址 或者 百度网盘 提取码&#xff1a;39hu 二&#xff0c;安装应用 安装完成打开VirtualXposed可以看到界面&#xff0c;点击下面圆圈就可以进入添加应用&#xff0c;模块管理&#xff0…

Vue.js 框架源码与进阶 - Vue.js 源码剖析 - 模板编译

文章目录 一、模板编译简介二、体验模板编译的结果三、Vue Template Explorer四、编译的入口函数五、模板编译过程5.1 compileToFunctions5.2 compile5.3 baseCompile5.3.1 baseCompile-AST5.3.2 baseCompile-parse5.3.3 baseCompile-optimize5.3.4 baseCompile-generate 5.4 模…

全栈低码开源框架 json-script-rule 配置说明

说明 配置主要分为映射信息配置和spring配置文件application的配置 映射信息 映射信息通常指的是所配置的po类与映射表的相关信息&#xff0c;通过相关注解来获取相关的静态信息&#xff0c;当然这里也可以通过其它的渠道来加载这些配置信息&#xff0c;如数据库、xml文件等…

全栈低码开源框架 json-script-rule 导入

说明 导入功能是将带有数据的excel文件上传后再通过程序导入到数据库&#xff0c;创建模型如下 Data public class JSRuleImport<A extends JSRuleAction<A>> implements IJSRuleActionModel<A>{/*** <p>导入excel对象&#xff0c;别名e* */JsonAlias…

Vue3 —— to 全家桶及源码学习

该文章是在学习 小满vue3 课程的随堂记录示例均采用 <script setup>&#xff0c;且包含 typescript 的基础用法 前言 本篇主要学习几个 api 及相关源码&#xff1a; toReftoRefstoRaw 一、toRef toRef(reactiveObj, key) 接收两个参数&#xff0c;第一个是 响应式对象…

vue框架安装mock

mock是&#xff1a;通过随机数据,模拟各种场景。 开发无侵入 不需要修改既有代码,就可以拦截 Ajax 请求,返回模拟的响应数据。 用法简单 符合直觉的接口。 1、安装mock前先安装axios请求 &#xff1a;** npm install axios --save** 安装成功axios的链接&#xff1a; 2、安装mo…

【甄选靶场】Vulnhub百个项目渗透——项目十六:FristiLeaks_1.3(文件上传,py脚本改写,sudo提权,脏牛提权,源码获取)

Vulnhub百个项目渗透 Vulnhub百个项目渗透——项目十六&#xff1a;FristiLeaks_1.3&#xff08;文件上传&#xff0c;py脚本改写&#xff0c;sudo提权&#xff0c;脏牛提权&#xff0c;源码获取&#xff09; 靶场地址 &#x1f525;系列专栏&#xff1a;Vulnhub百个项目渗透…

vue全家桶——vuex

本文主要介绍vuex【状态管理模式】&#xff0c;在介绍vuex前&#xff0c;需要重点说下一些概念 vue最大的特点之一。数据驱动视图&#xff0c;可以吧数据理解成状态&#xff0c;视图-view可以理解成用户看到的页面&#xff0c;页面是动态变化的&#xff0c;而这个变化必须是有…

博客园滑块验证码破解

极验最初的滑块验证码是两张图&#xff0c;首先出现的是原图&#xff0c;点一下出现凹槽&#xff0c;然后拖动滑块进去&#xff0c;注意拖拽速度就可以破解成功。 原理&#xff1a; 分别遍历扫描原图和有凹槽的图片像素&#xff0c;进行对比&#xff0c;像素不一致的位置就是凹…

尚硅谷Vue2.0+Vue3.0全套教程视频笔记 + 代码 [P001-050]

视频链接&#xff1a;尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通_哔哩哔哩_bilibili P1-50&#xff1a;当前页面。 P51-100&#xff1a;尚硅谷Vue2.0Vue3.0全套教程视频笔记 代码 [P051-100]_小白桶子的博客-CSDN博客 P101-135&#xff1a;尚硅谷Vue2.0Vue3.0全套教程视…