模拟实现库函数之字符串函数
目录
一 、求字符串长度
strlen 函数
二 、长度不受限制的字符串函数
strcpy函数
strcat函数
strcmp函数
三 、长度受限制的字符串函数
strncpy函数
strncat函数
strncmp函数
总结
一 、求字符串长度
strlen 函数
size_t strlen ( const char * str );//返回值为unsigned int类型
strlen函数是c语言的库函数,用来计算字符串的长度,遇到\0截止。
//举例
char str[]="seanyibo";
int len=strlen(str);//8
模拟实现strlen函数:
size_t my_strlen(const char* str) {char* start = str;char* end = str;while (*end != '\0') {end++;}return end - start;//指针相减即为它们之间的元素个数
}int main() {char str[] = "bjyxdaydayup";int len=my_strlen(str);printf("%d", len);//12return 0;
}
额外说明:我们前面有提到size_t为unsigned int 类型,这是因为字符串的长度不可能为负值,下面我们用一段代码来证明它。
二 、长度不受限制的字符串函数
strcpy函数
char* strcpy(char* destination,const char* source);
strcoy函数是c语言的库函数,将源(source)指向的C字符串复制到目标(destination)指向的数组中,包括终止空字符(并在该点停止)。
然而,我们需要注意以下几点:
1.我们的目标数组的长度必须大于等于我们的源数组;
2.源数组中必须包含‘\0’,否则无法确定有无'\0’或者‘\0’的位置在哪儿,可能会造成数组越界,非法访问。
模拟实现strcpy函数:
char* my_strcpy(char* dest, const char* sour) {assert(dest);//防止传入的是空指针assert(sour);char* start = dest;while (*dest++ = *sour++) {//复制完\0停止;}return start;//返回数组首元素地址
}
int main() {char str1[20] = "xxxxxx";char str2[] = "bjyx";//strcpy(str1, str2);my_strcpy(str1, str2);printf("%s", str1);return 0;
}
strcat函数
char * strcat ( char * destination, const char * source );
strcat是c语言库函数,将源字符串的内容附加到目标字符串。目标中的第一个终止空字符被源字符串的第一个字符覆盖,直到将原字符串全部完成(包括\0结束符),并且空字符包含在由目标中的两个字符串联形成的新字符串的末尾。
举例说明:
int main() {char str1[20] = "bjyx";char str2[] = "szd";strcat(str1, str2);printf("%s", str1);//bjyxszdreturn 0;
}
然而,我们需要注意的是:
1.目标字符数组的长度必须够容纳两个字符数组;
反例:char str1[6]="abcd";char str2[]="efghi";//报错,数组越界
2.源字符串必须以‘\0’结束;
3.目标空间必须可变。
模拟实现strcat函数:
char* my_strcat(char* dest, const char* sour) {//找到\0位置assert(dest && sour);char* str = dest;while (*str != '\0') {str++;}//将内容复制到\0后的空间while (*str++ = *sour++) {//\0复制完后结束;}return dest;//返回起始地址
}
int main() {char str1[20] = "bjyx";char str2[] = "szd9197";//strcat(str1, str2);printf("%s\n", my_strcat(str1,str2));//bjyxszd9197return 0;
}
注:strcat函数不能实现自己追加自己;因为此时的‘\0’已经被修改了。自己追加自己可以通过下述
strncat函数实现。
strcmp函数
int strcmp ( const char * str1, const char * str2 );
strcmp函数是c语言库函数,比较两个字符串的大小,从第一个元素开始,依次比较(比较的是对应位置上的字符的大小),并非长度。
判断字符串大小的例子如下图:
strcmp函数模拟实现:
int my_strcmp(const char* s1, const char* s2) {assert(s1 && s2);while (*s1 == *s2) {//相等往后++if (*s1 == '\0')return 0;s1++;s2++;}return *s1 - *s2;
}
int main() {char str1[] = "abx";char str2[] = "abcdef";int ret = my_strcmp(str1, str2);//>0,因为‘x’>'c'if (ret > 0)printf(">");else if (ret < 0)printf("<");else printf("=");return 0;
}
三 、长度受限制的字符串函数
strncpy函数
char * strncpy ( char * destination, const char * source, size_t num );//num表示传递的元素个数
strncpy为c语言库函数,能够实现从源字符串中拷贝num个元素到目标字符串中。
//举例 char str1[] = "wybxz!!!!!";//char str1[]="wx\0haha"char str2[20] = { 0 };strncpy(str2, str1, 6);printf("%s\n", str2);//wybxz!//printf("%s\n",str2);//wx
从上图调试中,我们可以看到strncpy在拷贝时,如果num小于字符串长度,并不会在拷贝num个字符后追加上‘\0’;
然而,如果源字符串的长度小于num或者在复制num个字符之前找到了源字符串的结尾(即‘\0’),则在拷贝完源字符串后,在后面追加\0,直到总共拷贝了num个元素。
模拟实现strmcpy函数:
char* my_strncpy(char* dest, const char* src, size_t n) {char* start = dest;while (n&&(*dest++ = *src++)){//wybxz10 9 8 7 6 5 4 3 2n--;}//字符串长度小于numif (n != 0) {while (--n) {*dest++ = '\0';}}return start;
}
int main() {char str1[] = "wybxz!!!";char str2[20] = "hahahahahah";//strncpy(str2, str1, 10);my_strncpy(str2, str1, 10);printf("%s\n", str2);return 0;
}
strncat函数
char* strncat(char* destination,const char* source,size_t num);
strncat函数是c语言库函数,能够实现将目标字符串后追加num个字符,目标中的第一个终止空字符被源字符串的第一个字符覆盖,直到追加了num个字符。
注意:如果源字符串的长度小于num,则只复制到‘\0’的内容。
//举例char str1[] = "daytoy!!!";char str2[18] = "xz_";strncat(str2, str1, 6);printf("%s\n", str2);//xz_daytoy
模拟实现strncat函数:
char* my_strncat(char* dest,const char* src, size_t n) {char* cur = dest;while (*cur != '\0') {cur++;}while (n--) {if (*src != '\0')//目标字符串长度大于n或者未遇见'\0'*cur++ = *src++;}//以'\0'结束*cur = '\0';return dest;
}
int main()
{char str1[] = "daytoy!!!";char str2[18] = "xz_";//strncat(str2, str1, 6);my_strncat(str2, str1, 11);printf("%s\n", str2);return 0;
}
实现自己追加自己:
char str1[18] = "sean";strncat(str1, str1, 4);printf("%s\n",str1);//seansean
注意:此时的num长度只能为源字符串元素个数,并且源字符数组的空间必须足够大。
strncmp函数
int strncmp ( const char * str1, const char * str2, size_t num );
strncmp是c语言库函数,用来比较两个字符串的大小直到出现另一个字符不一样或者一个字符串结束或者num个字符比较完。
int my_strncmp(const char* str1, const char* str2, size_t num) {char* s1 = str1;char* s2 = str2;while (num&&(*s1 == *s2)) {if (*s1 == '\0')return 0;//一个字符串结束s1++;s2++;num--;}if (num == 0)return 0;//前num个元素都相等return *s1 - *s2;//出现不相等字符
}
int main() {char str1[] = "happy";char str2[] = "habbit";//int ret=strncmp(str1, str2, 6);//>0int ret= my_strncmp(str1, str2, 6);//>0if(ret>0)printf(">");else if(ret==0) printf("=");else printf("<");return 0;
}
总结
以上就是针对部分字符串函数的模拟实现!!!祝大家顺顺利利健健康康,下次见!!!
模拟实现库函数之字符串函数相关推荐
- c语言atof函数源码,【c语言】模拟实现库函数的atof函数
// 模拟实现库函数的atof函数 #include #include #include #include double my_atof(char const *p) { double ret = 0 ...
- 【C语言进阶】⑦字符串函数详解
文章目录 一.字符串函数汇总 1. 求字符串长度 - strlen(): 1.2 函数介绍: 1.3 自己模拟实现strlen()函数的功能 1.3.1 计数器版本 2. 字符串拷贝函数 - strc ...
- 【C语言】模拟实现库函数 strcpy(复制字符串内容) 与 strlen(求字符串长度)
前言:对于库函数的使用,我们不仅要会使用方法,更要知晓使用原理,而知晓使用原理最好的方法就是模拟相应库函数的使用. 今天我们就来模拟 strcpy(复制字符串内容) 与 strlen(求字符串长度)这 ...
- 字符函数、字符串函数、内存函数用法及其模拟实现
目录 1.strlen strlen的模拟实现 2.strcpy strcpy模拟实现 3.strcat - 字符串追加 模拟实现strcat 4.strcmp - 比较字符串 模拟实现stcmp 5 ...
- 【C语言进阶】字符串函数模拟实现
求字符串长度 strlen size_t strlen(const char*string); 头文件:<string.h> 功能: 计算字符串的长度,遇到'\0'便停止,统计'\0'之前 ...
- C语言函数: 字符串函数及模拟实现strtok()、strstr()、strerror()
C语言函数: 字符串函数及模拟实现strtok().strstr().strerror() strstr()函数: 作用:字符串查找.在一串字符串中,查找另一串字符串是否存在. 形参: str2在st ...
- 用c语言模拟实现常用字符串函数
目录 一.常用字符串函数介绍 1.strlen 2. strcpy 3.strcmp 4.strcat 5.strstr 二.模拟实现常用字符串函数 1.strlen 2.strcpy 3.strcm ...
- 字符函数和字符串函数的介绍及模拟实现
在C语言中,我们对字符和字符串的使用是非常频繁的,但是C语言本身是没有提供字符串类型的,字符串通常是放在常量字符串或者字符数组中. 需要调用或者使用这一类函数,必不可少的就是要调用其头文件<st ...
- 模拟实现常用字符串函数
1.查找子字符串函数strstr的实现char * my_strstr(const char * dest, const char * src)//const保护字符串不被更改 {assert(des ...
- 数据库拆分字符串函数_PHP | 不使用库函数将逗号分隔的字符串拆分为数组
数据库拆分字符串函数 Given a string with comma delimited, we have to split it into an array. 给定一个以逗号分隔的字符串,我们必 ...
最新文章
- python投掷骰子实验_Python小程序--模拟掷骰子
- Windows下Appium环境搭建(java版)
- 怎样将网站未收录的页面重新收录?
- MySQL中AES_ENCRYPT('密码','钥匙')函数 可以对字段值做加密处理
- [转载] java clone方法_Java Calendar clone()方法与示例
- 在线阅读各版本android系统源代码
- Linux 脚本安装包
- python求几何平均_算术平均、几何平均、调和平均、平方平均和移动平均
- 微博营销的优劣势。如何利用微博开展营销。
- linkedin python 领英技能 测评
- 对于ACM竞赛算法分类的整理
- Python采集股票数据信息
- 临时解决新款macbookpro m1pro刘海屏遮住部分菜单栏应用的问题
- 如何在业务开发中实现自我成长
- ARM服务器安装CentOS7.4
- 贝叶斯公式推导及意义
- 我的2016,新的开始新的起点
- seo模拟点击软件_关键词快排是什么?SEO快排、刷点击和快排发包原理分析
- VMware如此强大,势必成为开源世界的老大
- Thinkphp框架初始及安装部署
热门文章
- LORD MicroStrain 惯性传感系统
- 测试一枚-记录工作-覆盖率(二)
- dubbo filter原理
- 自动驾驶 Automotive SPICE(ISO/IEC 15504) 和CMMI有什么不同?
- C语言指数函数应用pow n次方
- 解决Win 10桌面 IE 图标消失问题的注册表代码
- Echarts世界国家中英文对照
- 基于微信小程序的校园第二课堂活动报名系统+后台管理系统(Springboot+mysql)-JAVA.VUE【数据库设计、论文、源码、开题报告】
- python计算器实验报告_python作业模拟计算器开发(第五周)
- 基于ArduPilot Rover 4.1.5版本的汉特四驱小车搭建(1)