strlen,strcpy,strcmp,strcat,strncpy,strncmp,strncat
写在前面:本文比较长,覆盖了c语言中较多的字符串函数,作者会先带各位了解标准库对函数的介绍,然后模拟实现相关功能。
strlen
求字符串长度
size_t表明返回一个无符号类型的数字,是因为考虑到length为非零整数
const 可以保护str指向的那块空间不被改变,因为我们只是去求字符串的长度,而不会去解引用改变内容
注意
看这样一段代码
#include<stdio.h>
#include <string.h>
int main(void)
{if (strlen("ab") - strlen("abc") > 0){printf(">");}else{printf("<");}return 0;
}
打印结果为“>”
原因是strlen的返回值是无符号类型的,此处结果是应该一个负数,在内存中存的是补码,但和0比较的时候,由于是无符号类型,所以被解读为一个很大的数字,远远大于了0
模拟
方法1(计数器)
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* p)
{assert(p);int ret = 0;while (*p++){ret++;}return ret;
}
int main(void)
{char* p = "string";printf("%d ", my_strlen(p));return 0;
}
方法2(递归)
//2.递归
int my_strlen(const char* p)
{if (*p)return 1 + my_strlen(++p);elsereturn 0;
}
方法3(指针-指针)
这种方法和VS2022库函数文件里的写法一样,所以我们参考微软工程师的代码
size_t __cdecl strlen (const char * str)
{const char *eos = str;while( *eos++ ) ;return( eos - str - 1 );
}
strcpy
拷贝字符串
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <string.h>
int main(void)
{char* arr1 = "abcd";char arr2[20] = { 0 };strcpy(arr2, arr1);printf("%s", arr2);return 0;
}
注意
如你所见,
1.arr2是被拷贝的空间,要求可以改变,应该是数组,而对源字符串不作要求,可以是字符指针指向的字符串常量,也可以是数组。
2.拷贝字符串以源字符串中的‘\0’结束。
可验证:
3.作为合格的程序员,你得保证目标空间可以存下你要拷贝的东西。(不要写bug)
模拟
char* my_strcpy(char* dest, const char* src)
{assert(dest && src);char* p = dest;while (*dest++ = *src++);return p;
}
int main(void)
{char arr1[] = "abcdd";char arr2[20] = { 0 };my_strcpy(arr2, arr1);printf("%s", arr2);return 0;
}
strcat
字符串追加
这个函数对’\0’要求很大,目标字符串和源字符串都得有’\0’。
模拟
char* my_strcat(char* dest, const char* src)
{assert(dest && src);char* p = dest;while (*dest) {dest++;}while (*dest++ = *src++);return p;
}
注意
不要拿这个函数给自己追加,因为会覆盖\0,不能结束追加。
strcmp
是他!就是他!
比较字符串大小
需要对返回值做一下说明:
比如“abcdef”和
"abu’,虽然前者比后者在长度上大得多,但比较字符串是对应位置依次比较,在‘u’和’c’处u> c,所以比较结束,前者小于后者,返回一个小于零的值
话不多说,直接模拟
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* p1, const char* p2)
{assert(p1 && p2);while (*p1 == *p2){p1++;p2++;}if (!*p1)return 0;elsereturn *p1 - *p2;
}
int main(void)
{char* p = "tomota";char* q = "tomoto";if (my_strcmp(p, q) > 0)printf(">");else if (my_strcmp(p, q) < 0)printf("<");elseprintf("=");return 0;
}
strncpy
说明
正常使用
你非要写BUG
目标空间不够用,你非要拷?
小手一抖,一个BUG
既然不够,拿0来凑
strncat
追加时,覆盖0,自己补0
你看看这小子就不做舔狗
这小子发现自己“追”不上,就给了0然后跑路了
strncmp
很简单,多的一个参数就是用来指定比较前“几”个字符
自己用着看
strlen,strcpy,strcmp,strcat,strncpy,strncmp,strncat相关推荐
- strlen, strcpy,strcmp,strcat,strncpy,strncmp,strncat,strst库函数的详细解析以及模拟实现
- C语言库函数的实现(strlen strcpy strcmp strcat strstr)
库函数的实现 strlen strcpy strcmp strcat strstr assert函数 头文件:assert.h 又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的 ...
- 字符串函数实现(strlen,strcpy,strcmp,strcat,strrev)
声明:以下代码可能并非最佳方法,若有错误疑问欢迎提出!!! strlen函数 #include<stdio.h> #include<string.h>int mylen(cha ...
- 【C语言】字符串库函数的解读和模拟实现第一弹(strlen、strcpy、strcat、strcmp、strncpy、strncat 及 strncmp)
目录 一. strlen函数 1.1 strlen函数实现的功能及函数原型 1.1.1 strlen函数实现的功能 1.1.2 strlen的函数原型 1.1.3 strlen实现功能的更进一步解读 ...
- C基础--字符串操作函数(strlen,strcpy,strcmp,strcat,strstr,strtok,strchr)
#include <stdio.h> #include <string.h> int main(void) {//char dest[10];//#define NULL (v ...
- c语言strcpy两字符串长度不同,(C语言)自己写字符串操作函数(一)——strlen/strcpy/strcat/strcmp/st...
看到很多面试都会要求你写一些简单的字符串操作函数,这些函数看起来挺简单的,但是自己写的时候就会发现不少的问题.所以我自己把大部分的字符串操作函数都写了一遍,然后用了个测试程序来测试自己写的函数与库函数 ...
- 《C语言杂记》理解字符串处理函数 strlen() strcpy() strcat() strcmp()
在linux C 编程中,我们经常遇到字符串的处理,最多的就是字符串的长度.拷贝字符串.比较字符串等:当然现在的C库中为我们提供了很多字符串处理函数.熟练的运用这些函数,可以减少编程工作量,这里介绍几 ...
- c语言 strcpy原型,浅谈C语言中strcpy,strcmp,strlen,strcat函数原型
实例如下: //strcat(dest,src)把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0' char *strcat(char * strDest, cons ...
- C和指针之字符串之strlen、strcpy、 strcat、strcmp使用总结
1.常见字符串相关操作 我们知道有strlen. strcpy.strcat.strcmp.这样一一系列函数 2.实现Demo #include <stdio.h> #include &l ...
最新文章
- SpringIOC源码分析总结
- Linux下udp程序怎么运行,Linux下UDP的连接程序示例(阻塞、非阻塞)
- vb编程入门_【高能】用VB开发的彩票选号软件
- visual studio 2005,visual studio 2008调出即时窗口
- flash加载flv,本地测试正常,上传至空间则失败解决办法
- 成功解决ValueError: Dimension 1 in both shapes must be equal, for ‘Assign_8‘ (op: ‘Assign‘) with input s
- 蓝桥杯java第七届决赛第一题--愤怒小鸟
- YumRepo Error: All mirror URLs are not using ftp, http[s] or file. Eg. /HTML/ 标签: yum 2014-05-26
- python列表添加数字_Python-识别列表中的连续数字组
- (转)关于同步和异步的理解(ajax网络编程)
- T4模板——一个神奇的代码生成器
- 【Web文件上传下载】各种类型文件对应的content-type
- oracle goldengate director,Oracle GoldenGate Director安装和配置
- 清华天才王垠受邀面试阿里P9,被P10面跪后网上怒发文,惨打325的P10赵海平回应了!...
- 2021-03-25--通信网的身份认证与鉴权机制
- python日程表代码_【算法提高班】《我的日程安排表》系列
- 《数据驱动 从方法到实践》之 数据驱动的环节 学习总结
- python时间函数纳秒_python – 获取纳秒级精度的文件修改时间
- dellr320故障_用于对 PowerEdge 服务器进行高级故障处理的诊断工具
- 彩灯控制单片c语言程序,基于51单片机的led彩灯设计。 9个灯(红绿蓝三色)。按键控制 c语言程序...