Linux C语言:字符串处理函数

一、字符串函数

1、C库中实现了很多字符串处理函数

#include <string.h>
  • ① 求字符串长度的函数strlen
  • ② 字符串拷贝函数strcpy
  • ③ 字符串连接函数strcat
  • ④ 字符串比较函数strcmp

 2、字符串长度函数strlen

  • 格式:strlen(字符数组)
  • 功能:计算字符串长度
  • 返值:返回字符串实际长度,不包括‘\0’在内

        – 例:对于以下字符串,strlen(s)的值为:

char s[10]={‘A’,‘\0’,‘B’,‘C’,‘\0’,‘D’};
char s[ ]=“\t\v\\\0will\n”;
char s[ ]=“\x69\141\n”; //\xhh表示十六进制数代表的符号 \ddd表示8进制的
答案:1 3 3

3、字符串拷贝函数strcpy

  • 格式:strcpy(字符数组1,字符串2)
  • 功能:将字符串2,拷贝到字符数组1中去
  • 返值:返回字符数组1的首地址

说明:

  1. 字符数组1必须足够大
  2. 拷贝时‘\0’一同拷贝

4、字符串连接函数strcat

  • 格式:strcat(字符数组1,字符数组2)
  • 功能:把字符数组2连到字符数组1后面
  • 返值:返回字符数组1的首地址

说明:

  1. 字符数组1必须足够大
  2. 连接前,两串均以‘\0’结束;连接后,串1的 ‘\0’取消,新串最后加‘\0’ 
#include <string.h>
#include <stdio.h>
int main()
{char destination[25];char blank[] = " ", c[]= "C++",turbo[] = "Turbo";strcpy(destination, turbo);strcat(destination, blank);strcat(destination, c);printf("%s\n", destination);
return 0;
}

5、字符串比较函数strcmp

  • 格 式:strcmp(字符串1,字符串2)
  • 功 能:比较两个字符串
  • 比较规则:对两串从左向右逐个字符比较(ASCII码),直到遇到不同字符或‘\0’为止
  • 返 值:返回int型整数
  1. a. 若字符串1< 字符串2, 返回负整数
  2. b. 若字符串1> 字符串2, 返回正整数
  3. c. 若字符串1== 字符串2, 返回零

6、isalpha函数

  • 包含头文件
#include <ctype.h>
  • 函数声明
int isalpha(int c);
  • 功能说明
  • 判断参数c是否为字母
  • 返回值
  • 0-不是字母 非0-是字母 
    #include <stdio.h>
    int main()
    {
    printf("isalpha('0')=%d\n",isalpha('0'));
    printf("isalpha('a')=%d\n",isalpha('a'));
    printf("isalpha('A')=%d\n",isalpha('A'));
    }

7、 isupper() 函数

  • 包含头文件
#include <ctype.h>
  • 函数声明
int isupper(int c);
  • 功能说明
  • 判断参数c是否为大写字母
  • 返回值
  • 0-不是大写字母 非0-是大写字母
    #include <stdio.h>
    int main()
    {
    printf("isupper('-')=%d\n",isupper('-'));
    printf("isupper('0')=%d\n",isupper('0'));
    printf("isupper('a')=%d\n",isupper('a'));
    printf("isupper('A')=%d\n",isupper('A'));
    }

 7、toupper() 函数

  • 包含头文件
#include <ctype.h>
  • 函数声明
int toupper(int c);
  • 功能说明
  • 把小写字母转换为大写字母,如果参数c不是小写字母就不转换
  • 返回值
  • 返回值为转换后的结果。

8、tolower() 函数

  • 包含头文件
#include <ctype.h>
  • 函数声明
int toupper(int c);
  • 功能说明

        将给定的大写字母转换为对应的小写字母。如果给定的字符不是大写字母,则不对它做任何处理,也不会报错或者警告。

  • 返回值

        如果传入的字符是大写字母,则返回该字母的小写形式;如果传入的字符不是大写字母,则原样返回该字符。 

二、 strncpy函数

1、strncpy()函数用法

char * strncpy ( char * dest, const char * src, size_t n )
  • dest:目标字符串,即要将源字符串复制到的位置。
  • src:源字符串,即要复制的字符串。
  • n:要复制的字符数。

        目标字符串dest必须足够大,以容纳要复制的以及额外的'\0'。否则,可能会导致缓冲区溢出的问题。 

2、strncpy函数注意事项 

  1) 如果源字符串的长度大于或等于n,则目标字符串将不会以'\0'结尾,需要手动添加'\0'。 

#include <stdio.h>
#include <string.h>
int main() {
char dest[20];
char src[] = "helllo world!";
strncpy(dest, src, 8);
dest[8] = '\0';
printf("%s\n", dest);
return 0;
}

        使用strncpy函数将src的前8个字符复制到dest中。由于源字符串的长度大于或等于n,我们需要在dest的后面添加'\0'。

 

2) 如果源字符串的长度小于n,则复制完源字符串后,会用'\0'填充剩余的空间。

char *strncpy(char *dest, const char *src, int len) {
assert(dest != NULL && src != NULL);
char *res = dest;
int offset = 0;
if (strlen(src) < len) { //src长度小于len
offset = len - strlen(src);
len = strlen(src);
}
while (len--) {
*dest++ = *src++;
}
while (offset--) {
*dest++ = '\0';
}
return res;
}

 

三、strncat函数 

1、函数原型:

char* strncat(char* dest, const char* src, int n)

2、头 文 件:

#include <string.h>

3、返 回 值:

        返回dest字符串的起始地址

4、说 明:

  • 1. dest要有足够的空间来容纳要拷贝的字符串
  • 2. strncat会将dest字符串最后的’\0’覆盖掉,字符追加完成后,再追加’\0’
  • 3. 如果源字符串的长度小于n,会将源字符串的全部字符追加到目标字符串中。如果源字符串的长度大于或等于n,则只会将源字符串的前n个字符追加到目标字符串中。

5、用法示例 

#include <stdio.h>
#include <string.h>
int main()
{char dest[20] = { "hello " };char src[] = { "world!" };strncat(dest, src, 5);printf("%s\n", dest);
return 0;
}

6、函数实现 

#include <stdio.h>
#include<string.h>
#include <assert.h>
//dest为前面的字符串,src为后面要加的字符串,n为要拷贝的字符个数
char* My_strncat(char* dest, const char* src, int n) {
char* ret = dest; //将dest首地址储存在ret中
assert(dest != NULL && src != NULL); //保证dest、src非空
while (*dest != '\0')//用指针往后一个个找,找到dest结尾的‘\0’
dest++;
while (n && (*dest++ = *src++) != '\0')//把src里的字符一个个放入dest后
//(*dest++ = *src++) 表示先把*src赋给*dest,再把两个指针同时往后移
n--; //循环跳出条件
*dest = '\0'; //字符追加完成后,再追加’\0’
return ret; //返回dest字符串起始地址
}int main() {char arr1[20] = "I LOVE YOU ";My_strncat(arr1, "SORRY" ,3);
//经过函数My_strncat后 ,arr1里应该是字符串I LOVE YOUSORprintf("arr1: %s\n", arr1);
return 0;
}

四、strncmp函数

1、函数原型: 

int strncmp(const char* str1, const char* str2, size_t n)

2、头 文 件:

#include <string.h>

3、返回值:

str1 = str2 则返回0,
str1 > str2 则返回大于0的值,
str1 < str2 则返回小于0的值
  • 将str1字符串的第一个字符的ACSII值减去str2第一个字符的ACSII值(自左向右比较前n个字符,直到出现不同的字符或遇'\0'为止)
  •  若差值为零则继续比较下去;若差值不为零,则返回差值。

4、 strncmp函数实现

//以’\0’结尾的字符串 const修饰防止字符串被修改,进行保护
int My_strncmp(const char* str1, const char* str2, int n) {
if (!n) //n=0时,无字符要比,直接return 0
return 0;
while (--n && *str1 && *str1 == *str2) {
//当字符相等且不为’\0’时比较下个字符,直到n=0比完
str1++;
str2++;
}
return *str1 - *str2;
//字符不相等时,(*str1 - *str2)可以满足返回值正负的需求
}

 5、用法示例:

int main() {char str1[] = "SSLOVE YOU ";char str2[] = "SORRY";
//经过手算可发现O的ACSII=79,S的ACSII=83,应该返回4printf("%d\n", My_strncmp(str1, str2,2));
return 0;
}

 6、strchr函数

1、函数原型: 

char *strchr(const char *str, int c);

2、参数说明:

str:要搜索的字符串。
c:要查找的字符,作为一个整数传递给函数。

3、返回值:

  • 如果找到了字符 c,则返回一个指向该字符的指针。
  • 如果未找到字符 c,则返回 NULL 指针。

4、功能:

  • 用于查找字符在字符串中第一次出现的位置
#include <stdio.h>
char *myStrchr(char *str, int c) {while (*str != '\0') {if (*str == c) {return str;
}str++;
}
return NULL;
}
int main() {char *str = "Hello, world!";char *result = myStrchr(str, 'o');if (result != NULL) {printf("在字符串中找到字符 'o',位置为:%ld\n", result - str);
} else {printf("未找到字符 'o'。\n");
}
return 0;
}
int main()
{
char str1[] = { "eeeabcaaa" };
char str2[] = { "abc" };
char* ret = my_strstr(str1, str2);if (*ret != NULL)printf("%s", ret);
elseprintf("没找到!");
return 0;
}

7、 strstr函数

1、函数原型: 

char * strstr ( const char * str1, const char * str2 );

2、功能:

  • 返回字符串中首次出现子串的地址

3、参数:

1.str1:要扫描的 C 字符串
2.str2:包含要匹配的字符序列的 C 字符串。

4、返回值:

  • 返回指向 str2 中第一次出现的 str1 的指针,如果 str2 不是 str1的一部分,则返回一个空指针。匹配过程不包括终止’\0’,但它到此为止。

5、strstr函数的模拟

int main()
{
char str1[] = { "eeeabcaaa" };
char str2[] = { "abc" };
char* ret = my_strstr(str1, str2);if (*ret != NULL)printf("%s", ret);
elseprintf("没找到!");
return 0;
}

#include <stdio.h>
char* my_strstr(const char* str1, const char* str2) {
char* p = str1;//保存每次比较的起始地址
char* s1 = p;//初始指针s1
char* s2 = str2;//初始指针s2
while (*p != '\0') {//挨个遍历主字符串s1 = p;//赋值s1每次比较初地址s2 = str2;//赋值子 字符串的首地址
while (*s1!='\0' && *s2 != '\0' &&*s1 == *s2) { //比较字串与主串s1++;s2++;
}if (*s2 == '\0')//当字串比较到字串的\0 时,说明已经比较完字串,找到了
return p;//返回保存的初始比较位置p++;//挨个遍历主字符串
}
return NULL;
}

int main()
{
char str1[] = { "eeeabcaaa" };
char str2[] = { "abc" };
char* ret = my_strstr(str1, str2);if (*ret != NULL)printf("%s", ret);
elseprintf("没找到!");
return 0;
}

6、strstr函数的使用

#include <stdio.h>
#include <string.h>
int main() {
char str1[] = { "eeeabcaaa" };
char str2[] = { "abc" };
char* ret = strstr(str1, str2);if (*ret != NULL)printf("%s", ret);
elseprintf("没找到!");
return 0;
}

 

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

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

相关文章

【Python】已解决报错:AttributeError: module ‘json‘ has no attribute ‘loads‘解决办法

&#x1f60e; 作者介绍&#xff1a;我是程序员洲洲&#xff0c;一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 &#x1f913; 同时欢迎大家关注其他专栏&#xff0c;我将分享Web前后端开发、人工智能、机器学习、深…

1)Java项目笔记搭建系统梳理相关知识

目录 前言项目结构Java部分Spring整合部分SpringBoot整合部分 模块说明规划 小结javarabbitmqmybatisspring最后推荐几本工具书 前言 工作有年头了&#xff0c;学到了很多技术&#xff0c;收获了很多。但是对与工作相关的专业技能知识的掌握杂而乱&#xff0c;不够全面系统。因…

Web应用安全测试-综合利用(一)

Web应用安全测试-综合利用&#xff08;一&#xff09; 文章目录 Web应用安全测试-综合利用&#xff08;一&#xff09;1.跨站脚本攻击&#xff08;XSS&#xff09;漏洞描述测试方法GET方式跨站脚本Post方式跨站脚本 风险分析风险等级修复方案总体修复方式对于java进行的web业务…

21.FuturePromise

在异步处理时,经常用到两个接口Future 和 Promise。 说明:Netty中的Future与jdk中的Future同名,但是是两个接口,netty的Future继承了jdk的Future,而Promise又对Netty的Future进行了扩展。 JDK的Future只能同步等待任务结束(成功、失败)才能得到结果。FutureTask.get()方…

ROS中使用超声波传感器(附代码)

在ROS中使用超声波传感器通常涉及到订阅或发布sensor_msgs/Range类型的消息。下面是一个简单的示例&#xff0c;展示了如何使用C在ROS中编写一个超声波传感器的驱动程序。这个例子假设你有一个超声波传感器连接到了Arduino或者其他微控制器&#xff0c;并且该微控制器已经通过串…

SpringBoot三层架构

目录 一、传统方式 二、三层架构 三、代码拆分 1、dao层 2、service层 3、control层 四、运行结果 一、传统方式 上述代码存在一定的弊端&#xff0c;在进行软件设计和软件开发中提倡单一责任原则&#xff0c;使代码的可读性更强&#xff0c;复杂性更低&#xff0c;可扩展性…

QT day03

思维导图 QT设计 升级优化自己应用程序的登录界面。 要求&#xff1a; 1. qss实现 2. 需要有图层的叠加 &#xff08;QFrame&#xff09; 3. 设置纯净窗口后&#xff0c;有关闭等窗口功能。 4. 如果账号密码正确&#xff0c;则实现登录界面关闭&#xff0c;另一个应用界面…

HarmonyOS(37) APP crash崩溃日志收集插件@hw-agconnect使用指南

hw-agconnect使用指南 添加配置文件配置SDK依赖初始化SDK参考资料 添加配置文件 获取agconnect-services.json文件。将“agconnect-services.json”文件拷贝到DevEco Studio项目的“AppScope/resources/rawfile”目录下。 配置SDK依赖 在“oh-package.json5”文件的“depende…

【数据初步变现】论自助BI在数字化转型中如何赋能业务

引言&#xff1a;数字化转型要求企业更加依赖数据来指导业务决策。自助BI作为数据分析的重要工具&#xff0c;能够迅速、准确地从海量数据中提取有价值的信息&#xff0c;为企业的战略规划和业务执行提供有力支持。在数字化时代&#xff0c;企业需要快速响应市场变化并优化业务…

标准立项 | 膜曝气生物膜反应器(MABR)平板曝气膜

立项单位&#xff1a;天津市华宇膜技术有限公司、中国市政工程中南设计研究总院有限公司、中建生态环境集团有限公司、富朗世水务技术(江苏)有限公司、常州宣清环境科技有限公司 膜组件开发 膜腔内部支撑结构-一在膜腔内部设置支撑结构以防止膜腔在水压下压实&#xff0c;同时…

五、路由协议

目录 一、为何划分子网&#xff1f; 二、静态路由 三、OSPF 3.1、OSPF原理 3.1.1、ospf四步过程 3.2、OSPF区域划分 3.2.1、为什么划区域&#xff1f; 3.2.2、划分规则 3.3、OSPF参数 3.4、五种报文 3.4.1、hello报文 3.4.2、DD报文 3.4.2、LSR、LSU、LSAck报文 3…

“深入探讨Redis主从复制:原理、配置与优化“

目录 # 概念 1. 配置主从同步步骤 1.1 创建文件夹 1.2 复制配置文件 1.3 配置文件关闭 1.4 查看端口号&#xff0c;发现端口号存在 1.5 连接三个端口号 1.6 查看主机运行情况 1.7 让服务器变成&#xff08;主机&#xff09;或&#xff08;从机&#xff09; 1.8 实现效…

【达梦数据库】typeorm+node.js+达梦数据库返回自增列值

1.配置环境&#xff0c;下载依赖包 typeorm init --name test22 --database mysql typeorm-dm&#xff0c;uuid,typeorm2,修改连接信息 修改src/ data-source.ts 文件 连接dm&#xff0c;可参考刚刚安装typeorm-dm 模块中的 README.md 3.修改自增信息 /* 修改前*/PrimaryGen…

【数据结构与算法 刷题系列】判断链表是否有环(图文详解)

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《数据结构与算法 经典例题》C语言 期待您的关注 ​ ​ 目录 一、问题描述 二、解题思路 1.解题思路: 2.快慢指针的移动分三个…

✅生产问题之Emoji表情如何操作存储,MySQL是否支持

针对 Emoji 表情 MySQL 存储是否支持的问题&#xff0c;结论是&#xff1a; MySQL 中可以存储 emoji 表情&#xff0c;但需要使用 UTF8MB4 字符编码。如果使用 UTF8MB3&#xff0c;存储这些扩展字符会导致解析错误。 课外补充 MySQL 对 Unicode 的支持 Unicode 字符集已成为…

6.17作业

升级优化自己应用程序的登录界面。 要求&#xff1a; 1. qss实现 2. 需要有图层的叠加 &#xff08;QFrame&#xff09; 3. 设置纯净窗口后&#xff0c;有关闭等窗口功能。 4. 如果账号密码正确&#xff0c;则实现登录界面关闭&#xff0c;另一个应用界面显示。 //发送端头文件…

AI训练Checkpoint对存储的影响

检查点&#xff08;Checkpoints&#xff09;是机器学习和深度学习训练过程中的一个重要机制&#xff0c;旨在定期保存训练状态&#xff0c;以便在训练过程中遇到失败或中断时能够从中断处恢复训练&#xff0c;而无需从头开始。 随着模型参数量的剧增&#xff0c;Checkpoint文件…

经历的分享

我是三本计算机科学技术跨考上岸的学生&#xff0c;本科阶段技术能力并没有掌握多少&#xff0c;在选择导师时屡屡碰壁&#xff0c;我当时向许多计算机方向的导师&#xff0c;比如大数据方向,计算机视觉 迁移学习和图像处理方向的导师全都拒绝了我&#xff0c;最终学校给我分配…

【机器学习300问】122、RNN面临哪些问题?

循环神经网络&#xff08;RNN&#xff09;主要面临梯度消失和梯度爆炸两个核心问题&#xff0c;这严重影响了其处理长期依赖的能力。此外&#xff0c;还存在一些其他的技术挑战。 一、两个主要问题 &#xff08;1&#xff09;梯度消失和梯度爆炸问题 这是RNN中最显著的问题之…

区间预测 | Matlab实现CNN-ABKDE卷积神经网络自适应带宽核密度估计多变量回归区间预测

区间预测 | Matlab实现CNN-ABKDE卷积神经网络自适应带宽核密度估计多变量回归区间预测 目录 区间预测 | Matlab实现CNN-ABKDE卷积神经网络自适应带宽核密度估计多变量回归区间预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CNN-ABKDE卷积神经网络自适应…