strlen ,strcmp,strcat,strcpy函数以及实现
1.四种函数的简介与功能实现
2.四种函数的用C语言实现
第一节 四种函数的简介与功能实现
概述:四种函数作为库函数均存在于头文件<string.h>中,在程序编写时,我们可以通过头文件,来对这四种库函数进行直接引用。
接下来,对以上这四种库函数的功能进行逐一介绍:
strlen函数:
功能:求字符串的长度,从内存的某个位置开始扫描,直到碰到第一个字符串结束符\0为止,然后返回"\0"之前的字符数。
说明:已知一个字符串时,想要直接获取该字符串的长度时,可以通过该函数进行获取。
功能实现:
#include <stdio.h>
#include <string.h>
int main()
{char arr[10] = "hello"; //也可以用指针定义:const char*arr = "hello"int n = strlen(arr);printf("%d", n);return 0;
}
strcmp函数
功能:比较两个字符串的ACSII码值
说明:若两个字符的ACSII码值相等,则继续比较,(遇到'\0',比较结束)若不相等,则通过返回值来判断两个字符串的关系。(一般情况下,返回值有 1, -1,0三种情况)
返回值:
(1)若差值 = 0,则结束比较,说明两个字符串相等;
(2)若差值 > 0,则说明:字符串1>字符串2;
(3)若差值 < 0, 则说明: 字符串1<字符串2。
功能实现:
#include <stdio.h>
#include <string.h>
int main()
{char arr[10] = "hello"; //用指针:const char* arr = "hello";char brr[10] = "hella"; //用指针:const char* brr = "hella";int n = strcmp(arr, brr);printf("%d", n);return 0;
}
strcat函数
功能:将两个字符串进行链接
说明:字符串1存储于数组1中,字符串2存储于数组2中,将字符串2拼接在字符串1后面,使其变为一个新的字符串。
功能实现:
#include <stdio.h>
#include <string.h>
int main()
{char arr[100] = "hello"; //此处不可写为:const char* arr = "hello"; char brr[100] = "world"; //此处可以写为:const char* brr = "world";strcat(arr, brr);printf("%s", arr);return 0;
}
strcpy函数
功能:将已知的一个字符串进行复制
说明:字符串1存储于数组1中,数组2为一个空数组,通过该函数可以将数组1中的字符串复制进入数组2中。
功能实现:
#include <stdio.h>
#include <string.h>
int main()
{char arr[100] = "hello world"; //此处可以写为:const char* arrchar brr[100] = {0}; //此处不可以写为:const char* brrstrcpy(brr,arr);printf("%s", brr);return 0;
}
第二节 四种函数的用C语言实现
概述:在平常解决问题中,我们可以直接引用头文件#include <string.h>来直接引用这四种函数,但是如果不让使用库函数来解决问题,那我们也可以根据库函数的功能用C语言的普通语句将其实现出来,同时也可以练习并提高自己的编写代码能力。
接下里,将给大家介绍以上四种函数用C语言基本语句的实现
每个函数,将分别用数组和指针分别给大家进行演示:
strlen函数
指针实现
#include <stdio.h>
#include <assert.h>
int my_strlen(const char* arr)
{assert(arr!=NULL);int cnt = 0;while (*arr){cnt++;arr++;}return cnt;
}
int main()
{const char* arr = "hello";int len = my_strlen(arr);printf("%d", len);return 0;
}
数组实现
#include <stdio.h>
#include <assert.h>
int my_strlen(char arr[100])
{assert(arr!=NULL);int i = 0, len = 0;while (arr[i] != 0){len++;i++;}return len;
}
int main()
{char arr[100] = { "hello"};int len = my_strlen(arr);printf("%d", len);return 0;
}
以上两种方法都是递归算法,在数据结构中,我们会了解到一种递归算法,这种算法既有优点,也有缺点;
优点:代码更简洁清晰,可读性更好;
缺点:时间和空间消耗比较大。
先大概了解这么多,以后为单独为大家讲解,下面是strlen函数递归算法的解法:
以字符串“hello”,为例:
我们想要知道一个字符串的长度,可以定义一个指针,通过指针的移动来进行计数,而计数结束的标准则是当指针遇到字符'\0'时,则停止,此时,指针在不断靠近'\0'的过程中,则要不断地调用my_strlen函数,则不断调用该函数的思想过程成为递归思想。
当指针在遇到'\0'前会不断地自增,同时也会不断地调用自身函数,让指针进行进一步自增同时也会返回一个“+1”的值,等遇见'\0'时,返回0值,将0值作为最后一次调用my_strlen函数的函数值返回给上一个1 + my_strlen(arr),再将这次的结果作为返回值进行进一步的返回,以此类推,最终将最后的函数返回给main()函数。
代码如下:
#include <stdio.h>
int my_strlen(const char* arr)
{if (*arr){arr++;return 1 + my_strlen(arr);}return 0;
}
int main()
{const char* arr = "hello";int result = my_strlen(arr);printf("%d", result);return 0;
}
说完递归与非递归,还有第三种方法等着大家哦:
指针相减法:
首先来说一下,什么是指针相减法
如果两个指针指向同一个数组,它们就可以相减,其结果为两个指针之间的元素数目,如果两个指针不是指向同一个数组,它们相减就没有意义了。
#include <stdio.h>
int my_strlen(const char* arr)
{const char* p = arr;while (*arr){arr++;}return arr - p;
}
int main()
{const char* arr = "hello";int result = my_strlen(arr);printf("%d", result);return 0;
strcmp函数
指针实现
#include <stdio.h>
#include <assert.h>
int my_strcmp(const char* arr, const char* brr)
{assert(arr != NULL && brr != NULL);while (*arr == *brr){if (*arr == '\0') //hellreturn 0; //helloarr++;brr++;}int result = *arr - *brr;if (result > 0)return 1;else if (result < 0)return -1;elsereturn 0;
}
int main()
{const char* arr = "hell";const char* brr = "hello";int result = my_strcmp(arr, brr);printf("%d", result);return 0;
}
数组实现
#include <stdio.h>
#include <assert.h>
int my_strcmp(char arr[], char brr[])
{assert(arr != NULL && brr != NULL);int i = 0, j = 0;while (arr[i] == brr[j]){if (arr[i] == '\0')return 0;i++;j++;}int result = arr[i] - brr[j];if (result > 0)return 1;else if (result < 0)return -1;elsereturn 0;
}
int main()
{char arr[100] = "hell";char brr[100] = "hello";int result = my_strcmp(arr, brr);printf("%d", result);return 0;
}
strcat函数
指针实现
注:此处指针实现strcat函数,使用了三种方法,在代码中已经标明:/*(1) */为第一种,/*(2)*/为第二种,正在使用的是第三种。
第一种与第三种的原理类似,都是通过遍历完字符串arr后在arr后将brr的字符串加进去,第二种通过计算arr长度后,通过解引用的方式,给字符串arr后直接赋予字符串brr的内容。
#include <stdio.h>
#include <assert.h>
#include <string.h> //为了计算len_arr而使用,也可也不使用
void my_strcat(char* arr, char* brr)
{assert(arr != NULL && brr != NULL);int len_arr = strlen(arr);/*(1) while (*arr){arr++;}while (*brr){*arr++ = *brr++;}*//*(2)int i = 0;while (*(brr + i)){*(arr + len_arr + i) = *(brr + i);i++;}*/while (len_arr>0){arr++;len_arr--;}while (*brr){*arr++ = *brr++;}
}
int main()
{char arr[100] = "hello";const char* brr = "world";my_strcat(arr, brr);printf("%s", arr);return 0;
}
数组实现
#include <stdio.h>
#include <assert.h>
#include <string.h>
void my_strcat(char arr[],char brr[])
{int i = 0, j = 0;assert(arr != NULL && brr != NULL);int len_arr = strlen(arr);/*(1)while (arr[i]){i++;}while (brr[j]){arr[i] = brr[j];i++;j++;}*//*(2)while (brr[j]){arr[len_arr + i] = brr[j];i++;j++;}*/while (len_arr > 0){i++;len_arr--;}while(brr[j])arr[i++] = brr[j++];
}
int main()
{char arr[100] = "hello";char brr[100] = "world";my_strcat(arr, brr);printf("%s", arr);return 0;
}
以上数组实现也为三种方法。
strcpy函数
指针实现
注:/* */注释中的内容为my_strcpy的另一种方法,第一种方法是用while()循环,第二种方法是用for()循环。
#include <stdio.h>
#include <assert.h>
void my_strcpy( char* arr, char* brr)
{assert(arr != NULL && brr != NULL);while(*arr){*brr++ = *arr++ ;}*brr= '\0' ;
}
/*for (int i = 0; *(arr + i) != '\0'; i++){*brr++ = *(arr + i);}*brr = '\0';*/
}
int main()
{char arr[100] = "hello";char brr[100];my_strcpy(arr, brr);printf("% s", brr);return 0;
}
数组实现
#include <stdio.h>
#include <assert.h>
void my_strcpy(char brr[],char arr[])
{assert(arr != NULL && brr != NULL);/*int i = 0, j = 0;while (arr[i]){brr[j++] = arr[i++];}*/int j = 0;for (int i = 0; arr[i]!= '\0'; i++){brr[j++] = arr[i];}
}
int main()
{char arr[100] = "hello";char brr[100] = { 0 };my_strcpy(brr, arr);printf("%s", brr);return 0;
}
数组实现用了两种方法,注释内部为第一种方法,注释外部是第二种方法。
strlen ,strcmp,strcat,strcpy函数以及实现相关推荐
- C语言 模拟实现 strlen strcat strcpy函数
strlen函数 库函数strlen:strlen所作的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0' ...
- 关于strcmp与strcpy函数的相关用法
strcpy的相关讲解:若字符串char b[100]赋值给字符串char a[100],若strlen(a)>length(b),a字符串的'\0'后也确实赋值了,但是输出的话,遇到第一个'\ ...
- strlen函数,strcat函数,strcpy函数,strncpy函数,strcmp函数
strcpy函数: char *strcpy(char *Dest , const char *Src) { assert((Dest != NULL) && (Src != NULL ...
- 字符串函数实现(strlen,strcpy,strcmp,strcat,strrev)
声明:以下代码可能并非最佳方法,若有错误疑问欢迎提出!!! strlen函数 #include<stdio.h> #include<string.h>int mylen(cha ...
- strlen函数,strcpy函数,strcat函数,memset函数,strcmp函数,memcpy函数,memove()函数
文章目录 一,strlen函数(库函数头文件<string.h>) 二,strcpy函数(库函数头文件<string.h>)拷贝函数 三,strcat函数(头文件是<st ...
- 字符串函数:strlen函数,strcpy函数,strcat函数,strcmp函数
目录: 1.字符串函数strlen (1)strlen函数 (2)strlen的使用 a.代码 b.运行结果 (3)模拟实现strlen函数 a.代码 b.运行结果 (4)注意: 2.字符串函数str ...
- C语言常用字符串操作函数大全详解(strstr,strtok,strrchr,strcat,strcmp,strcpy,strerror,strspn,strchr等)
参考:string.h中常用字符串操作函数说明(strstr,strtok,strrchr,strcat,strcmp,strcpy,strerror,strspn,strchr等) 作者:一只青木呀 ...
- C语言之字符串探究(三):字符串库函数操作——strlen、strcat、strcpy、strcmp
相关博文:C++之char和string字符串类探究 相关博文:C语言之数组探究(一):定义.大小.初始化.访问和三要素 相关博文:C语言之字符串探究(一):字符串与字符数组 相关博文:C语言之字符串 ...
- C语言之字符串探究(二):字符串原生操作——strlen、strcat、strcpy、strcmp自实现
相关博文:C++之char和string字符串类探究 相关博文:C语言之数组探究(一):定义.大小.初始化.访问和三要素 相关博文:C语言之字符串探究(一):字符串与字符数组 相关博文:C语言之字符串 ...
最新文章
- 美多商城之验证码(短信验证码2)
- php多表数据排除,thinkphp中多表查询中防止数据重复的sql语句(必看)
- 安装python缺少dll_解决Python安装时报缺少DLL问题【两种解决方法】
- 获300万美元融资!Dgraph宣布:其图数据库正式发布!
- Struts2中配置默认Action
- 给工厂分配销售组织/分销渠道
- 向量时钟Vector Clock in Riak
- C++高手总结的编程规律
- 超大气APP下载页双语多国语言网站源码
- fastjson和json-lib的区别
- 华为云张昆:支持全场景全业务,GaussDB加速企业数字化转型
- 【clickhouse】clickhouse NO DELAY, INTO OUTFILE, SETTINGS, ON, FORMAT, Dot, SYNC, token
- mac下载站,这个可以收藏看看
- 【数据分享】错颌畸形生长患者治疗数据集
- 计算机病毒的一些印象
- MD5加密概述,原理及实现
- Linux基础知识点总结
- HTML+css实现元素居中对齐的方法
- js:使用angular的http获取json数据
- iCCP: cHRM chunk does not match sRGB
热门文章
- 什么是「文本基因计划」?
- 第九届信安技能赛BATV提供20万奖学金,助力i春秋大学生成长计划
- python海象运算符_【译】Python3.8新语法:海象运算符
- 数据库之如何优化数据库,提高数据库的性能?
- 大话设计模式——装饰者模式
- 手把手教你python--爬取网站首页(学生必看)
- ppt打印一页6张铺满不留白_赌5毛钱,这绝对是你一直想学但找不到教程的3D特效PPT玩法...
- 疯狂Android讲义(第3版)学习笔记(第二章---界面编程)
- 百度语音识别、语音合成,NAudio录音(C#)
- VS2010安装包制作 [桌面快捷图标 右键属性 打开文件位置]问题解决