news 2026/8/22 9:55:13

字符串函数及其应用

作者头像

张小明

前端开发工程师

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/8/21 21:45:42

效果惊艳!BAAI/bge-m3打造的文本相似度案例展示

效果惊艳&#xff01;BAAI/bge-m3打造的文本相似度案例展示 1. 引言&#xff1a;语义相似度在AI应用中的核心地位 在当前人工智能技术快速演进的背景下&#xff0c;语义理解能力已成为构建智能系统的关键基础。无论是检索增强生成&#xff08;RAG&#xff09;、智能客服、内容…

作者头像 李华
网站建设 2026/8/21 21:45:49

技术突破+实战指南:DINOv2与Mask2Former融合的智能实例分割方案

技术突破实战指南&#xff1a;DINOv2与Mask2Former融合的智能实例分割方案 【免费下载链接】dinov2 PyTorch code and models for the DINOv2 self-supervised learning method. 项目地址: https://gitcode.com/GitHub_Trending/di/dinov2 你知道吗&#xff1f;在当前的…

作者头像 李华
网站建设 2026/8/21 21:45:48

Chat2DB终极选择指南:5个关键问题帮你找到最适合的版本

Chat2DB终极选择指南&#xff1a;5个关键问题帮你找到最适合的版本 【免费下载链接】Chat2DB chat2db/Chat2DB: 这是一个用于将聊天消息存储到数据库的API。适合用于需要将聊天消息存储到数据库的场景。特点&#xff1a;易于使用&#xff0c;支持多种数据库&#xff0c;提供RES…

作者头像 李华
网站建设 2026/8/21 21:45:48

终极指南:快速掌握Bilidown免费B站视频下载工具

终极指南&#xff1a;快速掌握Bilidown免费B站视频下载工具 【免费下载链接】bilidown 哔哩哔哩视频解析下载工具&#xff0c;支持 8K 视频、Hi-Res 音频、杜比视界下载、批量解析&#xff0c;可扫码登录&#xff0c;常驻托盘。 项目地址: https://gitcode.com/gh_mirrors/bi…

作者头像 李华
网站建设 2026/8/21 21:27:49

yfinance终极指南:3分钟掌握金融数据获取与分析的完整教程

yfinance终极指南&#xff1a;3分钟掌握金融数据获取与分析的完整教程 【免费下载链接】yfinance Download market data from Yahoo! Finances API 项目地址: https://gitcode.com/GitHub_Trending/yf/yfinance 想要快速获取股票市场数据却不知从何入手&#xff1f;&…

作者头像 李华
网站建设 2026/8/21 21:27:48

5分钟部署BGE-M3模型:零基础搭建文本检索系统

5分钟部署BGE-M3模型&#xff1a;零基础搭建文本检索系统 1. 引言 在现代信息检索系统中&#xff0c;文本嵌入&#xff08;Embedding&#xff09;技术是实现语义搜索、文档匹配和知识库问答的核心。BGE-M3 是由 FlagAI 团队推出的多功能文本嵌入模型&#xff0c;具备密集检索…

作者头像 李华