库函数之字符函数与字符串函数(下)
创始人
2025-05-30 12:35:34

在这里插入图片描述

前言

🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨
🐻推荐专栏: 🍔🍟🌯 c语言进阶
🔑个人信条: 🌵知行合一
🍉本篇简介:>:介绍c语言中有关字符函数与字符串函数部分库函数.包括模拟实现,参数介绍等.
金句分享:

✨花会沿路盛开,你以后的路也是!✨

目录

  • 前言
  • 一、strncpy函数,strncat函数,strncmp函数
    • 函数作用
      • strncpy函数
      • strncat函数
      • strncmp函数
    • 函数参数模型
    • 参数介绍
    • 模拟实现strncpy
    • 模拟实现strncat函数
    • 模拟实现strncmp函数
  • 二、strstr函数
    • 函数参数模型
    • 函数作用:
    • 函数的应用
    • 模拟实现
    • 动图解析:
  • 三、strtok函数
    • 函数参数模型
    • 函数作用:
    • 函数应用
    • strtok函数注意事项:
  • 四、strerror函数
    • 函数作用
    • 函数应用

一、strncpy函数,strncat函数,strncmp函数

头文件:#include

看过上一篇的小伙伴们都知道,对于下列函数应该都有所了解.

strcpy函数:.拷贝字符串函数
strcat函数:.追加字符函数
strcmp函数:.字符串拷贝函数

这些函数在使用时,都是遇到’\0’,才停止他们的拷贝,追加,比较等操作
如果我们想要只操作其中的部分,就可以增加一个参数来实现.
由于功能参数等与前面的函数相似,本篇不做重点讲解.

函数作用

strncpy函数

拷贝num个字符从源字符串到目标空间

strncat函数

追加num个源字符到目标空间

strncmp函数

比较两个字符串的前num个字符,返回值与strcmp一致.

函数参数模型

char * strncpy ( char * destination, const char * source, size_t num );
char * strncat ( char * destination, const char * source, size_t num );
int strncmp ( const char * str1, const char * str2, size_t num );

参数介绍

增加一个size_t 类型的参数num,用于限定原来的函数.

模拟实现strncpy

#include 
#include 
char* my_strncpy(char* strDest, const char* strSource, size_t count)
{assert(strDest);assert(strSource);char* ret = strDest;while (count--){*strDest++ = *strSource++;}return ret;
}
int main()
{char arr1[20] = "xxxxxxxxxxxxxx";char arr2[] = "Hello CSDN!";int sz2 = sizeof(arr2) / sizeof(arr2[0]);printf("%s", my_strncpy(arr1,arr2,5));return 0;
}

运行结果:

Helloxxxxxxxxx

注意:

1.strncpy只拷贝num个字符,并不会额外附加’\0’字符.
2.如果源字符串的长度小于num,则拷贝完源字符串之后,在目标的后边追加0,直到num个.
这个在模拟的时候并没有添加上去.

模拟实现strncat函数

#include 
#include 
char* my_strncat(char* destination, const char* source, size_t num)
{assert(destination);assert(source);char* ret = destination;while (*destination != '\0'){destination++;}while (num--){*destination++ = *source++;}return ret;
}int main()
{char arr1[20] = "Hello ";char arr2[] = "CSDN!";int sz2 = sizeof(arr2) / sizeof(arr2[0]);printf("%s", my_strncat(arr1, arr2, 3));return 0;
}

运行结果:

Hello CSD

模拟实现strncmp函数

#include 
#include 
int my_strncmp(const char* str1, const char* str2, size_t num)
{while (num--){if (*str1 > *str2){return 1;}else if (*str1 < *str2){return -1;}str1++;str2++;}return 0;
}
int main()
{char arr1[20] = "aabbccdd";char arr2[] = "aabbcdef";int sz2 = sizeof(arr2) / sizeof(arr2[0]);printf("%d", my_strncmp(arr1, arr2, 5));return 0;
}

运行结果:

0

解释:
因为前5个字符相同,num个字符比较结束,认为是相同字符串.

二、strstr函数

strstr函数

头文件:#include

函数参数模型

在这里插入图片描述

函数作用:

用于查找主字符串中是否包含子字符串.包含返回第一次匹配成功的字符首地址.不包含则返回NULL.

函数的应用

力扣------找出字符串中第一个匹配的下标.
通过strstr函数找到第一个匹配的字符指针,

该指针-字符串首地址指针=该字符的下标.

int strStr(char * haystack, char * needle){char*ret=strstr(haystack,needle);if(ret-haystack<0)//小于0时,返回-1;{return -1;}return ret-haystack;
}

模拟实现

  1. 创建三个指针
  2. p1指向主字符串首地址,p2指向子字符串首地址.
  3. ret用于保存p1回退的位置.
  4. 当*p1==p2时,p1和p2继续向后比较,当p1!=*p2时,说明ret位置不对,则ret++
  5. p1退回到ret位置,p2回到初始位置,重新比较.
  6. 直到p2指向’\0’,则匹配成功,p1指向’\0’则匹配失败.

动图解析:

在这里插入图片描述

代码实现:

#include 
#include 
char* my_strstr(const char* str1, const char* str2)
{assert(str1 && str2);if (*str2 == '\0')//如果子字符串是空字符串,直接返回主字符串{return str1;}const char *ret,*p1,*p2;ret = p1 = str1;p2 = str2;while (*p1&&*p2)//循环停止条件为主字符串或者子字符串有一个为空{if (*p1 == *p2)//相等则继续比较{p1++;p2++;}else//不相等则返回指定位置重新比较{p1 = ++ret;p2 = str2;}}if (*p2 == '\0')//如果子字符串比较结束,则匹配成功{return ret;}else//否则匹配失败return NULL;
}
int main()
{char str1[20] = "ABBCDABBACBBD";char str2[] = "ABBA";char* ret = my_strstr(str1, str2);if (ret == NULL){printf("没有找到\n");}else printf("%s", ret);
}

ABBACBBD

三、strtok函数

strtok函数
头文件:#include

函数参数模型

strtok函数

在这里插入图片描述

函数作用:

将字符串str根据delimiters 中的字符进行分割.

参数介绍:

参数意义
str需要被分隔的字符串(第一次传参的时候),传入NULL指针时,会从上一次修改的地址处
delimiters定义了用作分隔符的字符集合

函数应用

#include 
#include 
int main()
{char str1[30] = "123.456.789_111,222@333";char str2[30];char a[] = "._,@";strcpy(str2, str1);//因为strtok函数会改变传过去的字符串的内容,所以我们是将备份传过去char* ret;//除了第一次调用时第一个参数为str2以外,后面的调用都是传入NULL,这样才会继续向后寻找标记分隔字符.for (ret = strtok(str2, a); ret != NULL; ret = strtok(NULL, a)){printf("%s\n", ret);}return 0;
}

运行结果:

123
456
789
111
222
333

strtok函数注意事项:

strtok函数并不是一次就将字符串中的所有分隔字符改为’\0’,而是调用它一次,修改一个.
strtok函数第一次调用时,会找到str中的第一个分隔符标记,并将其用 \0 结尾,然后返回一个指向这个标记的指针。
strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容并且可修改。:

strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置。
strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标记。

如果后面已经没有标记分隔,则返回 NULL 指针.

四、strerror函数

sterror函数

在这里插入图片描述

函数作用

库函数在使用错误时,会返回一串数字,这些数字就是错误码.
strerror函数用于返回错误码对应的错误信息.

例如:

#include 
#include 
int main()
{printf("%s\n", strerror(0));printf("%s\n", strerror(1));printf("%s\n", strerror(2));printf("%s\n", strerror(3));printf("%s\n", strerror(4));printf("%s\n", strerror(5));return 0;
}

No error
Operation not permitted
No such file or directory
No such process
Interrupted function call
Input/output error

但是strerror函数并不是这样使用的,因为我们也不知道错误码是什么,像上面这种是属于提前预判了的.
在库函数执行错误后,会将错误码存放在一个error的变量中.所以一般strerror函数是这样使用的.

函数应用

#include 
#include 
#include int main()
{//打开文件FILE* pf = fopen("CSDN.txt", "r");if (pf == NULL){//printf("%s\n", strerror(errno));perror("fopen");return 1;}//关闭文件fclose(pf);pf = NULL;//避免空指针return 0;
}

perror函数等价于printf(“%s\n”, strerror(errno));
即strerror函数是返回指向错误信息的字符串地址,而perror函数是将错误信息直接打印出来.

希望这篇文章能帮助大家对c语言中的库函数有关字符函数和字符串函数有更深层的理解.
今天就先到这里啦!!!
886
在这里插入图片描述

相关内容

热门资讯

全面控货价格仍倒挂,泸州老窖无... 泸州老窖离“白酒老三”宝座越来越远,面临的挑战也越来越严峻了。5月29日,履职十年的董事钱旭离职的公...
识局安排安徽某政府对接工业机器... 文/识局招商团队(识局微信公共账号zhijuzk)6月6日,周五。识局安排安徽某政府对接工业机器人项...
V观财报|*ST天喻及实控人之...   中新经纬6月6日电 *ST天喻6日盘后公告,公司及实际控制人之一闫春雨于6月6日分别收到《中国证...
未来已来,怎么抓住先进科技新起... 所有的产业都值得用AI重新做一遍用。用这句话来总结新一轮的AI科技浪潮,可能并不过分,人工智能技术正...
嘉麟杰:控股股东一致行动人及实... 6月6日晚间,上海嘉麟杰纺织品股份有限公司(嘉麟杰,002486.SZ)公告,公司控股股东绍兴国骏企...
58同城姚劲波6.6亿“买药”... 初代互联网大佬寻找“第二曲线”!作者 | 赵普编辑丨高岩来源 | 野马财经姚劲波出手,易明医药(00...
隆基绿能:股东HHLR拟减持不... 6月6日晚间,隆基绿能科技股份有限公司(隆基绿能,601012.SH)公告,截至本公告披露日,HHL...
阿特斯:股东元禾重元拟减持不超... 6月6日晚间,阿特斯阳光电力集团股份有限公司(阿特斯,688472.SH)公告,公司于今日收到持股3...
公募REITs总市值突破200... 距首批REITs上市不到4年时间,全市场公募REITs总市值突破2000亿元。第一财经获悉,未来,数...
破解融资难题 稠州银行金融“活... 潮新闻客户端 通讯员 刘家慧 民营企业是经济发展的生力军,是浙江市场经济高度活跃的金名片。作为起源于...
深交所:本周共对14起上市公司... 6月3日至6月6日,深交所共对80起证券异常交易行为采取了自律监管措施,涉及盘中拉抬打压、虚假申报等...
德国ETF今年悄悄大涨3成,原... 今年QDII最火基金。 作者 | 市值风云基金研究部 编辑 | 小白 风云君发现,今年外国股市中,...
6月6日沪深两市强势个股与概念... 一、强势个股截至6月6日收盘,上证综指上涨0.04%,收于3385.36点,深证成指下跌0.19%,...
玩商标文字游戏“多半”“翻车” 维 辰 断句的艺术,被一些人给玩明白了。 前有“壹号土猪肉”“千禾0酱油”中的“壹号土”“千禾0”其...
突发!千亿级险企中邮保险原总经... 据财新报道,中邮人寿原总经理党均章失联了,消息称其已经被有关部门带走调查。 公开资料显示,党均章,...
白银价格创13年来新高,投资时... 文/张文晖6月5日,贵金属市场上演了一场令人瞩目的行情。现货白银价格大幅飙升,一度涨幅超过4.5%,...
5天翻倍股金陵体育:苏超联赛有... “苏超”概念股金陵体育公告称,苏超联赛有部分场地使用了公司的足球比赛器材。6月6日,江苏金陵体育器材...
如何选出业绩长期稳定的基金?(... 优秀的基金经理在业绩表现上往往有一个显著特点:短期业绩未必锋芒毕露,但随着时间维度拉长,业绩却愈发亮...
英国承认:统计数据存在重大错误... 有多少资讯是真正有用的?FinGraph是中文财经世界唯一一家每日图形化早晚专栏,为专注于全球市场的...
王自如AI创业,坦言“来钱快” 王自如投身 AI 创业领域,其言辞中毫不掩饰地提及“来钱快”。这一表述反映出当下 AI 创业的某种现...
又一培训机构,黄了? 培训机构... 5月24日晚上,知名医考教培机构“金英杰”创始人赵红峰,被自家员工堵在了办公室。当天,员工们发现自己...
上交所:将推动上市公司进一步加... 据上交所发布6月6日消息,为贯彻落实党中央、国务院关于资本市场的决策部署,落实中央政治局会议和新“国...
上交所召开高分红重回报暨上市公... 6月5日,上海证券交易所召开高分红重回报暨上市公司价值提升座谈会,就进一步提升高分红、高股息率上市公...
全球吃瓜!马斯克怒掀特朗普情色... 全世界最有钱的人,和美国最有权的人。骂出了全世界,最难听的话!今天一早,外网都炸了, 因为马斯克的爆...
《西游记》演员叶以萌去世!曾饰... 搜狐娱乐讯 近日,据博主《1982西游记》透露,演员叶以萌于6月4日凌晨2点38分因病医治无效离世,...
6月6日复盘:银行+新消费牛市... 昨天A股成交量是1.29万亿,因为有增量资金,我觉得市场继续上涨问题是不大的。但今天成交量只有1.5...
美财政部“书面指导”:日本央行... 美国财政部罕见"指导"日本央行加息,日本财务大臣加藤胜信回应称,将把货币政策细节留给日本央行来决定。...
苏股IPO | 刚刚,无锡这家... 今天(6月6日),上交所上市审核委员会2025年第18次会议审核通过江阴华新精密科技股份有限公司(以...
不正当竞争、强制骑手二选一 ?... 唉,我记得当初,京东给外卖骑手兄弟,写过一封信。其中一点是:对兼职骑手永不强迫“二选一”。但.......
港股收盘 | 三大指数周线延续... 财联社6月6日讯(编辑 胡家荣)本周港股三大指数延续近期涨势。截至周五收盘,恒生指数累计上涨2.16...