字符串_字符函数和字符串函数

C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中。

字符串常量适用于那些对它不做修改的字符串函数。

目录

1.函数介绍

1.1strlen

1.1.1strlen函数的模拟实现

1.2strcpy

1.2.1strcpy函数的模拟实现

1.3 strcat(字符串追加)

1.3.1strcat函数的模拟实现

1.4strcmp

1.4.1strcmp函数的模拟实现

1.5strncpy、strncat、strncmp的使用 

1.5.1strncat函数的模拟实现 

1.5.2strcpy函数的模拟实现 

1.5.3strcmp函数的模拟实现 

1.6strstr(查找子串的一个函数)

1.6.1strstr函数的模拟实现

1.7strtok(切割字符串)

1.8 strerror

1.函数介绍

1.1strlen

size_t strlen(const char* str);

注意:

字符串以'\0'作为结束标志,strlen函数返回的是在字符串中'\0'前面出现的字符个数但不包括'\0'。 

参数指向的字符串必须要以'\0'结束。

函数的返回值为size_t,是无符号的。(size_t转为定义即unsigned int)

1.1.1strlen函数的模拟实现

#include<stdio.h>
//法一:计数器实现
int my_strlen(char* str)
{int count = 0;while (*str != '\0'){str++;count++;}return count;
}
//法二:递归实现
int my_strlen(char* str)
{if (*str)return 1 + my_strlen(str + 1);elsereturn 0;
}
//法三:指针-指针
int my_strlen(char* str)
{char* p = str;while (*str){str++;}return str - p;
}
int main()
{char arr[] = "abcdef";int len = my_strlen(arr);printf("%d\n", len);return 0;
}

1.2strcpy

char* strcpy(char* destination,char* source);

注意:

源字符串必须以'\0'结束。

会将源字符串中的'\0'拷贝到目标空间。

目标空间必须足够大,以确保能存放源字符串。

目标空间必须可变

1.2.1strcpy函数的模拟实现

#include<stdio.h>
char* my_strcpy(char* dest, char* stc)
{char* ret = dest;while (*stc!='\0'){*dest++ = *stc++;}*dest = *stc;return ret;
}
//实际上strcpy返回的是目标空间的起始地址,因为我们是把源字符串拷贝到目标空间里,目标空间发生变化
int main()
{char arr1[20] = { 0 };char arr2[] = "hello world";my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}

1.3 strcat(字符串追加)

char* strcat(char* destination,char*  source)

注意:

源字符串必须以'\0'结束。

目标空间必须足够大,以确保能存放源字符串。

目标空间必须可修改。

1.3.1strcat函数的模拟实现

#include<stdio.h>
char* my_strcat(char* dest, char* stc)
{char* ret = dest;//1.找到目标空间末尾的\0while (*dest != '\0'){dest++;}//2.拷贝字符串while (*dest++ = *stc++)//相当于strcpy函数{;}return ret;
}
int main()
{char arr[20] = "hello ";my_strcat(arr, "world");printf("%s\n", arr);return 0;
}

 尽量不要自己给自己追加,可能会导致程序崩溃,因为在找到末尾的\0时会覆盖掉,导致自己破坏了自己的内容,从而陷入死循环。

1.4strcmp

int strcmp(const char* str1,const char* str2)

#include<stdio.h>
#include<string.h>
int main()
{char arr1[] = "zhangsan";char arr2[] = "zhangsan";int ret = strcmp(arr1, arr2);if (ret < 0)printf("<\n");else if (ret == 0)printf("==\n");elseprintf(">\n");return 0;
}

标准规定:第一个字符串大于第二个字符串,则返回大于0的数字;第一个字符串等于第二个字符串,则返回0;第一个字符串小于第二个字符串,则返回小于0的数字。

1.4.1strcmp函数的模拟实现

#include<stdio.h>
#include<string.h>
int my_strcmp(char* str1, char* str2)
{while (*str1 == *str2){if (*str1 == '\0')return 0;str1++;str2++;}return (*str1 - *str2);
}
int main()
{char arr1[] = "zhangsan";char arr2[] = "zhangsand";int ret = my_strcmp(arr1, arr2);if (ret < 0)printf("<\n");else if (ret == 0)printf("==\n");elseprintf(">\n");return 0;
}

1.5strncpy、strncat、strncmp的使用 

上面几个字符串函数不受长度限制,会有安全隐患。这里提供几个长度受限制的字符串函数:strncpy、strncat、strncmp,这三个函数和strcpy、strcat、strcmp使用方法基本一致,但其多了一个n,并且在调用函数时多了一个参数,其用来限制具体操作的字符个数。

cahr* strncat(char* destination,char* source,size_t num) ;

char* strcpy(char* destination,char* source,size_t num) ;

char* strcmp(char* destination,char* source,size_t num) ;

我们拿strncat举例: 

#include<stdio.h>
int main()
{char arr1[20] = "abcdef";char arr2[] = "hello";strncat(arr1, arr2,3);printf("%s\n", arr1);return 0;
}

 1、将source指向字符串的前num个字符追加到destination指向的字符串末尾,再追加一个\0字符。

2、如果source指向的字符串的长度小于num的时候,只会将字符串中到\0的内容追加destination指向的的字符串末尾。

1.5.1strncat函数的模拟实现 

#include<stdio.h>
char* my_strncat(char* dest, char* stc, int num)
{char* p = dest;while (*dest){dest++;}while (*stc&&num--){*dest++ = *stc++;}*dest = '\0';return p;
}
int main()
{char arr1[20] = "abcdef";char arr2[] = "hello";my_strncat(arr1, arr2,3);printf("%s\n", arr1);return 0;
}

1.5.2strcpy函数的模拟实现 

#include<stdio.h>
char* my_strncpy(char* dest, char* stc, int num)
{char* p = dest;while (num--){*dest++ = *stc++;}return p;
}
int main()
{char arr1[20] = "abcdef";char arr2[] = "hello";my_strncpy(arr1, arr2,3);printf("%s\n", arr1);return 0;
}

1.5.3strcmp函数的模拟实现 

 

#include<stdio.h>
int my_strncmp(char* dest, char* stc, int num)
{while (num && dest && stc){if (*dest > *stc){return 1;}if (*dest < *stc){return -1;}num--;dest++;stc++;}return 0;
}
int main()
{char arr1[20] = "abcdef";char arr2[20] = "abcdeq";int ret=my_strncmp(arr1, arr2, 6);if (ret>0)printf(">\n");else if (ret<0)printf("<\n");elseprintf("==\n");return 0;
}

1.6strstr(查找子串的一个函数)

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

例子:

#include<stdio.h>

int main()
{
    char arr1[] = "abcdef";
    char arr2[] = "bcde";
    char* ret = strstr(arr1, arr2);//如果能找到,返回的是b的地址,找不到返回的是空指针
    if (ret == NULL)
        printf("找不到\n");
    else
        printf("%s\n",ret);
    return 0;
}

1.6.1strstr函数的模拟实现

#include<stdio.h>
char* my_strstr(const char* str1,const char* str2)//尽量不要让str1和str2乱动
{const char* s1 = str1;const char* s2 = str2;const char* p = str1;while (*p){s1 = p;s2 = str2;while (*s1 != '\0' && *s2 != '\0' && *s1 == *s2){s1++;s2++;}if (*s2 == '\0')return p;p++;}return NULL;
}
int main()
{char arr1[] = "abbbcdef";char arr2[] = "bcde";char* ret = my_strstr(arr1, arr2);//如果能找到,返回的是b的地址,找不到返回的是空指针if (ret == NULL)printf("找不到\n");elseprintf("%s\n",ret);return 0;
}

1.7strtok(切割字符串)

char* strtok(char* str,char* sep);

sep参数是一个字符串,定义了用作分隔符的字符集合;

第一个参数指定一个字符串,它包含了0个或多个由sep字符串中一个或者多个分隔符的标记;

strtok函数找到str中的下一个标记,并将用\0结尾,返回一个指向这个标记的指针;

strtok函数的第一个参数不为NULL,函数将找到str中第一个标记,strtok函数将保存它在字符串中的位置;

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

如果字符串中不存在更多的标记,则返回NULL指针。

#include<stdio.h>
int main()
{const char* sep = "@.";char data[] = "http@csdn.com";char cp[30] = { 0 };//因为strtok函数在找字符串时会把标记符改成\0,所以可以拷贝一个临时数组strcpy(cp, data);char* ret = strtok(cp, sep);printf("%s\n", ret);ret = strtok(NULL, sep);//这个空指针代表从保存好的位置不断向后找,是一种状态。printf("%s\n", ret);ret = strtok(NULL, sep);printf("%s\n", ret);//这样写是比较挫的,换种写法char* ret = NULL;for (ret = strtok(cp, sep); ret != NULL; ret = strtok(NULL, sep)){printf("%s\n", ret);}return 0;
}

1.8 strerror

char* strerror(int errnum);

返回错误码,所对应的错误信息。

举个例子:

#include<stdio.h>
#include<errno.h>
#include<string.h>
int main()
{//errno-C语言设置的一个全局的错误码存放的变量FILE* pf = fopen("text.txt", "r");if (pf == NULL){printf("%s\n", strerror(errno));return 1;}return 0;
}

字符分类函数:

函数如果它的参数符合下列条件就返回真
iscntrl任何控制字符
isspace空白字符:空格' ',换页'\f',换行'\n',回车'\r',制表符'\t'或者垂直制表符'\v'
isgigit十进制数字0~9
isxdigit十六进制数字,包括所有十进制数字,小写字母a~f,大写字母A~F
islower小写字母a~z
isupper大写字母A~Z
isalpha字母a~z或A~Z
isalnum字母或者数字,a~z,A~Z,0~9
ispunct标点符号,任何不属于数字或者字母的图形字符(可打印)
isgraph任何图形字符
isprint任何可打印字符,包括图形字符和空白字符

 详情可参考cpulscpuls.com网站,上面有详细介绍

字符转换:

int tolower(int c);//转小写

int toupper(int c);//转大写

 

 

 

 

 

 

 

 

 

 

 

 

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

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

相关文章

2024年5月16日 十二生肖 今日运势

小运播报&#xff1a;2024年5月16日&#xff0c;星期四&#xff0c;农历四月初九 &#xff08;甲辰年己巳月庚辰日&#xff09;&#xff0c;法定工作日。 红榜生肖&#xff1a;猴、鼠、鸡 需要注意&#xff1a;牛、兔、狗 喜神方位&#xff1a;西北方 财神方位&#xff1a;…

英飞凌SiC模块为小米电动车提供动力

至2027年之际&#xff0c;SiC功率模块与裸片产品将荣耀登场&#xff0c;助力小米电动汽车新品SU7璀璨问世。英飞凌&#xff0c;这家业界翘楚&#xff0c;将倾其所能&#xff0c;为小米SU7 Max提供两颗HybridPACK Drive G2 CoolSiC 1200 V模块&#xff0c;如同给电动汽车的心脏注…

算法练习第22天|39. 组合总和、40.组合总和II

39. 组合总和 39. 组合总和 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/combination-sum/description/ 题目描述&#xff1a; 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数…

char x[]---char*---string---sizeof

字符串数组 #include <iostream>int main(){char c_str[]"abcd";char c_str1[]{a,b,c,d};std::cout<<sizeof(c_str)<<std::endl;std::cout<<sizeof(c_str1)<<std::endl;return 0; } char*存储的字符串个数 char*字符串所占字节大小 c…

信创电脑|暴雨新增兆芯KX-7000处理器版本

IT世界 5 月 15 日消息&#xff0c;暴雨公司信创家族新上架了一款搭载兆芯KX-7000系列处理器、摩尔线程8GB 显卡、16G DDR5 内存以及 512G SSD 的新配置台式电脑主机。 兆芯 KX-7000 处理器采用开先的 8 核 Chiplet互联架构&#xff0c;最高频率3.7 GHz&#xff0c;拥有 32MB 的…

后端开发之用Mybatis简化JDBC的开发快速入门2024及数据库连接池技术和lombok工具详解

JDBC 简化JDBC的开发 JDBC仅仅是一套接口 是一套规范 Mybatis是持久层框架 用于简化JDBC的开发 使用Java语言操作关系型数据库的一套API 原始的JDBC程序 package com.bigdate.mybatis;import com.bigdate.mybatis.mapper.UserMapper; import com.bigdate.mybatis.pojo.Use…

容联云零代码平台容犀desk:重新定义坐席工作台

在数智化浪潮的推动下&#xff0c;企业亟待灵活适应市场变化、快速响应客户需求&#xff0c;同时还要控制成本并提升效率&#xff0c;传统的软件开发模式因开发周期长、成本高、更新迭代慢等问题&#xff0c;逐渐难以满足企业灵活多变的业务需求。 容犀Desk&#xff0c;观察到…

Vue.js的发展史(一)

Vue.js的发展史&#xff08;一&#xff09; 什么是Vue? Vue (发音为 /vjuː/&#xff0c;类似 view) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建&#xff0c;并提供了一套声明式的、组件化的编程模型&#xff0c;帮助你高效地开发…

Spring Security实现用户认证二:前后端分离时自定义返回Json内容

Spring Security实现用户认证二&#xff1a;前后端分离时自定义返回Json内容 1 前后端分离2 准备工作依赖WebSecurityConfig配置类 2 自定义登录页面2.1 Spring Security的默认登录页面2.2 自定义配置formLogin 3 自定义登录成功处理器4 自定义登录失败处理器5 自定义登出处理器…

经济寒冬 | 品牌策划人还可以去哪些行业发展?

在这个经济寒冬下&#xff0c;咱们品牌策划人也需要考虑后路问题了。 随着市场竞争的加剧和消费者需求的不断变化&#xff0c;品牌策划人的工作不再只是简单的广告宣传和市场推广。 咱们需要重新思考自己的角色&#xff0c;寻找新的生存和发展之道。 当然&#xff0c;品牌策…

VUE之旅—day2

文章目录 Vue生命周期和生命周期的四个阶段created应用—新闻列表渲染mounted应用—进入页面搜索框就获得焦点账单统计&#xff08;Echarts可视化图表渲染&#xff09; Vue生命周期和生命周期的四个阶段 思考&#xff1a; 什么时候可以发送初始化渲染请求&#xff1f;&#xff…

前端本地调试云效上Vue项目的构建产物

一、问题背景 前两天前端小伙伴&#xff0c;在云效上构建了一个前端项目&#xff0c;构建结果显示成功&#xff0c;访问后发现Console控制台报错&#xff1a;ReferenceError: defineComponent is not defined 在此之前的版本&#xff0c;构建和访问并没有此异常&#xff0c;而…

【设计模式】JAVA Design Patterns——Abstract-document(抽象文档模式)

&#x1f50d; 目的 使用动态属性&#xff0c;并在保持类型安全的同时实现非类型化语言的灵活性。 &#x1f50d; 解释 抽象文档模式使您能够处理其他非静态属性。 此模式使用特征的概念来实现类型安全&#xff0c;并将不同类的属性分离为一组接口 真实世界例子 考虑由多个部…

eMMC和SD模式速率介绍

概述 在实际项目开发中我们常见的问题是有人会问,“当前项目eMMC、SD所使用模式是什么? 速率是多少?”。这些和eMMC、SD的协议中要求的,要符合协议。接下来整理几张图来介绍。 eMMC 模式介绍 一般情况下我们项目中都是会支持到HS400 8bit 1.8V,最大时钟频率为200MHZ,通…

会议邀请函:Prometheus开源无人机平台-无人机追踪无人车代码实战|第四届中国智能汽车创新大会

扫描上方海报二维码&#xff0c;参与报名 阿木实验室&#xff1a;为机器人研发提供开源软硬件工具和课程服务&#xff0c;让研发更高效&#xff01; 技术发展的日新月异&#xff0c;阿木实验室将紧跟技术的脚步&#xff0c;不断把机器人行业最新的技术和硬件推荐给大家。如果你…

C#【进阶】委托和事件

委托和事件 文章目录 1、委托1、委托概念2、基本语法3、定义自定义委托4、使用自定义委托5、委托变量可以存储多个函数6、系统定义好的委托思考 怪物死亡数据更新 2、事件1、事件概念2、事件的使用3、为什么有事件思考 热水器 3、匿名函数1、匿名函数概念2、基本语法3、使用4、…

iLogtail 社区开源之夏活动来了!

作者&#xff1a;玄飏 在这个充满活力的夏日&#xff0c;随着阳光一同灿烂的是开源精神的光辉与创新的火花。iLogtail 社区高兴地宣布&#xff0c;我们正式加入开源之夏 2024 的行列&#xff0c;诚邀每一位怀揣梦想与激情的学生开发者&#xff0c;共同开启一场探索技术前沿、贡…

机器学习入门介绍

各位大佬好 &#xff0c;这里是阿川的博客 &#xff0c; 祝您变得更强 个人主页&#xff1a;在线OJ的阿川 大佬的支持和鼓励&#xff0c;将是我成长路上最大的动力 阿川水平有限&#xff0c;如有错误&#xff0c;欢迎大佬指正 目录 三大方向机器学习产生的原因机器如何学习…

基于springboot+vue+Mysql的大学生社团活动平台

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

图文成片剪辑软件,分享3个专业的工具!

在数字化时代&#xff0c;图文成片剪辑软件成为了我们创作与表达的重要工具。无论是想要制作一段引人入胜的短视频&#xff0c;还是打造一幅精美的图文海报&#xff0c;这些软件都能助你一臂之力。那么&#xff0c;图文成片剪辑软件的方法有哪些&#xff1f;又有哪些值得一试的…