news 2026/6/10 20:05:07

字符串函数及其应用

作者头像

张小明

前端开发工程师

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/6/10 19:11:28

3步搞定Qwen3-4B部署:vLLM镜像免配置实战教程

3步搞定Qwen3-4B部署&#xff1a;vLLM镜像免配置实战教程 随着大模型在实际业务场景中的广泛应用&#xff0c;快速、高效地部署高性能语言模型成为开发者的核心需求。Qwen3-4B-Instruct-2507作为通义千问系列中40亿参数规模的最新优化版本&#xff0c;在指令遵循、多语言理解、…

作者头像 李华
网站建设 2026/6/9 18:40:57

5步构建AI聊天应用:从零开始的完整开发指南

5步构建AI聊天应用&#xff1a;从零开始的完整开发指南 【免费下载链接】ai Build AI-powered applications with React, Svelte, Vue, and Solid 项目地址: https://gitcode.com/GitHub_Trending/ai/ai 还在为AI应用开发的复杂性而烦恼吗&#xff1f;想要快速搭建一个功…

作者头像 李华
网站建设 2026/6/10 16:02:05

轻量级VLM也能SOTA?PaddleOCR-VL-WEB文档解析全解析

轻量级VLM也能SOTA&#xff1f;PaddleOCR-VL-WEB文档解析全解析 1. 引言&#xff1a;轻量级模型如何实现文档解析的SOTA表现&#xff1f; 在当前视觉-语言模型&#xff08;VLM&#xff09;普遍追求参数规模的背景下&#xff0c;PaddleOCR-VL-WEB 的出现提供了一条截然不同的技…

作者头像 李华
网站建设 2026/6/2 23:01:57

AI图片超分入门必看:EDSR模型部署

AI图片超分入门必看&#xff1a;EDSR模型部署 1. 技术背景与应用价值 随着数字图像在社交媒体、安防监控、医疗影像等领域的广泛应用&#xff0c;低分辨率图像带来的信息缺失问题日益突出。传统的双线性插值或双三次插值方法虽然能够实现图像放大&#xff0c;但无法恢复原始图…

作者头像 李华
网站建设 2026/6/9 2:12:32

如何实现167倍实时语音合成?Supertonic技术深度揭秘

如何实现167倍实时语音合成&#xff1f;Supertonic技术深度揭秘 TOC 1. 引言&#xff1a;TTS技术的性能边界正在被打破 在智能语音交互日益普及的今天&#xff0c;文本转语音&#xff08;Text-to-Speech, TTS&#xff09;系统已成为人机沟通的核心桥梁。然而&#xff0c;传统…

作者头像 李华
网站建设 2026/6/10 10:02:37

voidImageViewer:Windows平台上的高效图像浏览解决方案

voidImageViewer&#xff1a;Windows平台上的高效图像浏览解决方案 【免费下载链接】voidImageViewer Image Viewer for Windows with GIF support 项目地址: https://gitcode.com/gh_mirrors/vo/voidImageViewer voidImageViewer是一款专为Windows系统打造的轻量级图像…

作者头像 李华