news 2026/7/15 1:11:22

字符串函数及其应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
字符串函数及其应用

将代码拷贝至vs可事半功倍。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<errno.h>
#include<ctype.h>
size_t my_strlen(const char* ptr)
{
assert(ptr);//指针不为空
size_t count=0;
while (*ptr++)
{
count++;
}
return count;
}
char* my_strcpy(char* dest, const char* src)
{
assert(dest&&src);
char* ptr=dest;
while (*dest++=*src++){;}//既赋值,又判断
return ptr;
}
char* my_strcat(char* dest, const char* src)
{
assert(dest && src);
char* ptr = dest;
while(*dest){dest++;}
while (*dest++ = *src++){;}
return ptr;
}
int my_strcmp(const char* p, const char* ptr)
{
assert(p&&ptr);//保证指针的有效性
for (;*p && *ptr;p++, ptr++)
{
if(*p>*ptr)
return 1;
if(*p<*ptr)
return -1;
}
return (*p-*ptr);
}
char* my_strstr(const char* p, const char* ptr)
//讨论特殊情况
{
assert(p&&ptr);
const char* s1=p;
const char* s2=ptr;
const char* s11=p;
while (*s11)
{
s1=s11;
s2=ptr;
while (*s1!='\0'&& * s1 == *s2)
{
s1++;
s2++;
if(*s2=='\0')
return (char*)s11;
}
s11++;
}
return NULL;
}//KMP算法:也是用来查找字串的

int main()
{
//strlen
//关注'\0'之前出现的字符个数
//返回值是size_t,unsigned int
char a1[]="abcdef";//abcdef\0
size_t len=strlen(a1);
printf("%u\n",len);
//
char arr1[]={'b','i','t'};//bit
len = strlen(arr1);
printf("%u\n", len);//随机值
//
if (strlen("abc") - strlen("abcdef") > 0)
{
printf(">\n");
}
else
{
printf("<\n");
}
//3与6都是size_t,相减之后得到的数(-3)被当作size_t,及非常大的整数
//模拟
len=my_strlen(a1);
printf("%u\n",len);

//strcpy--string copy
//原字符串必须要有\0,且会将\0拷贝至目标空间
//目标空间必须足够大且可修改
char a2[20]={0};
//a2="xiaomo";ERR
//表达式必须是可修改的左值,数组名是常量,不能被赋值
strcpy(a2,"xiaomo");
printf("%s\n",a2);
//
strcpy(a2, "xiao\0mo");
printf("%s\n", a2);
//调试发现,会拷贝\0,此时数组内容为x i a o \0 o \0 \0 \0...
//模拟
char arr2[20]={0};
my_strcpy(arr2,"minecraft");
printf("%s\n",arr2);

//strcat
//字符串追加
//目标空间足够大且可修改
//追加的字符串以\0结束
char a3[20]="hello ";
strcat(a3,"world");
printf("%s\n",a3);
//模拟
my_strcat(a3," xiaomo");
printf("%s\n",a3);
//
char arr3[20] ="hello";
//my_strcat(arr3, arr3);ERR
//自己追加自己时破坏了\0,陷入死循环

//strcmp:比较对应位的ASICC码值
char a4[20]="xiaomo";
char arr4[]="xiaoxiaomo";
//比较两个字符串是否相等
//if(a4==arr4){...};ERR,这比较的是地址
int ret=strcmp(a4,arr4);
if (ret < 0)
{
printf("<\n");
}
else if(ret==0)
{
printf("=\n");
}
else
{
printf(">\n");
}
//模拟
ret=my_strcmp(a4,arr4);
printf("ret=%d\n",ret);

//长度受限制的字符串函数,相比之下多了一个参数
//strncpy,strncat,strncmp
//更加安全,且功能更加强大
char a5[20]="world hello";
char arr5[]="xiaomoxiao";
strncpy(a5,arr5,6);//拷贝多少?
printf("%s\n",a5);

//strstr:查找子串,即在一个字符串内找另一个字符串
//返回字串在串中的起始位置,否则返回NULL
char email[]="2926851***@qq.com";
char substr[]="qq";
char* retu=strstr(email,substr);
if (retu == NULL)
{
printf("not found\n");
}
else
{
printf("%s\n",retu);
}
//模拟
retu=my_strstr(email,substr);
printf("%s\n",retu);

//strtok:切割字符串
const char* sep="@.";//用作分隔符的字符集合
//将标记替换为'\0',返回字段的起始位置指针
//所以它会改变原字符串的内容
//1.第一参数不为NULL,函数将找到第一个标记,返回字段的起始位置指针
//函数将保存标记在字符串中的位置
//记忆功能,static修饰的变量出作用域后不销毁,下一次进入函数依旧存在
//2.为NULL,从标记处开始找下一个标记,返回字段的起始位置指针
//诺不存在更多标记,则返回NULL
char* email_copy[20]={0};
strcpy(email_copy,email);
char* tok=NULL;
for(tok= strtok(email_copy,sep);tok!=NULL;tok= strtok(NULL, sep))
//执行一次;判断;重复执行
{
printf("%s\n",tok);
}

//C语言的函数库,在执行失败的时候,都会设置错误码
//strerror:返回错误码所对应的信息
printf("%s\n",strerror(0));
printf("%s\n", strerror(1));
printf("%s\n", strerror(2));
//...
//errno:C语言设置的一个全局的错误码存放的变量
FILE* pf=fopen("text.txt","r");//相对路径与绝对路径
if (pf = NULL)
{
printf("%s\n",strerror(errno));
//return 1;
}
else
{
//
}

//字符分类函数
//iscntrl,isspace,isdigit,isxdigit,islower,isupper,isalpha,isalnum,ispunct,isgraph,isprint
//isspace:是否为空白字符
printf("%d ",isspace('w'));//0
printf("%d ", isspace('\n'));//ture
printf("%d\n", isspace(' '));//ture
//isdigit:是否为数字字符
printf("%d ", isdigit('w'));//0
printf("%d\n", isdigit('9'));//ture

//字符转换函数:toupper,tolower
printf("%c\n", toupper('w'));//W
printf("%c\n", tolower('A'));//a
return 0;
}

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/8 13:53:40

PCSX2模拟器完全指南:10分钟从零到完美运行

PCSX2模拟器完全指南&#xff1a;10分钟从零到完美运行 【免费下载链接】pcsx2 PCSX2 - The Playstation 2 Emulator 项目地址: https://gitcode.com/GitHub_Trending/pc/pcsx2 还在为复杂的模拟器配置而烦恼&#xff1f;想要在电脑上重温PS2经典游戏却不知从何下手&…

作者头像 李华
网站建设 2026/6/30 3:03:30

PowerJob跨平台部署终极指南:从零到分布式调制的完整实践

PowerJob跨平台部署终极指南&#xff1a;从零到分布式调制的完整实践 【免费下载链接】PowerJob 项目地址: https://gitcode.com/gh_mirrors/pow/PowerJob 在当今多云混合架构盛行的时代&#xff0c;分布式任务调度框架的跨平台部署能力已成为企业技术选型的关键考量因…

作者头像 李华
网站建设 2026/7/14 3:27:27

3步搞定NocoBase部署:新手也能快速上手的完整指南

3步搞定NocoBase部署&#xff1a;新手也能快速上手的完整指南 【免费下载链接】nocobase 极易扩展的无代码/低代码开发平台。NocoBase is a scalability-first, open-source no-code/low-code platform to build internal tools. 项目地址: https://gitcode.com/GitHub_Tren…

作者头像 李华
网站建设 2026/7/14 12:28:23

Qwen多任务引擎部署:避免常见错误的10个建议

Qwen多任务引擎部署&#xff1a;避免常见错误的10个建议 1. 引言 1.1 业务场景描述 在边缘计算和资源受限环境中&#xff0c;AI模型的部署面临诸多挑战。传统做法是为不同任务&#xff08;如情感分析、对话生成&#xff09;分别部署专用模型&#xff0c;这种方式虽然直观&am…

作者头像 李华
网站建设 2026/7/14 2:50:36

智能微信助手革命:告别手动回复的烦恼时代

智能微信助手革命&#xff1a;告别手动回复的烦恼时代 【免费下载链接】wechat-bot &#x1f916;一个基于 WeChaty 结合 DeepSeek / ChatGPT / Kimi / 讯飞等Ai服务实现的微信机器人 &#xff0c;可以用来帮助你自动回复微信消息&#xff0c;或者管理微信群/好友&#xff0c;检…

作者头像 李华
网站建设 2026/7/14 6:37:43

PlayIntegrityFix终极指南:3分钟解锁Android设备完整认证

PlayIntegrityFix终极指南&#xff1a;3分钟解锁Android设备完整认证 【免费下载链接】PlayIntegrityFix Fix Play Integrity (and SafetyNet) verdicts. 项目地址: https://gitcode.com/GitHub_Trending/pl/PlayIntegrityFix 还在为Android设备无法通过Google Play Int…

作者头像 李华