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函数以及实现相关推荐

  1. C语言 模拟实现 strlen strcat strcpy函数

    strlen函数 库函数strlen:strlen所作的是一个计数器的工作,它从内存的某个位置(可以是字符串开头,中间某个位置,甚至是某个不确定的内存区域)开始扫描,直到碰到第一个字符串结束符'\0' ...

  2. 关于strcmp与strcpy函数的相关用法

    strcpy的相关讲解:若字符串char b[100]赋值给字符串char a[100],若strlen(a)>length(b),a字符串的'\0'后也确实赋值了,但是输出的话,遇到第一个'\ ...

  3. strlen函数,strcat函数,strcpy函数,strncpy函数,strcmp函数

    strcpy函数: char *strcpy(char *Dest , const char *Src) { assert((Dest != NULL) && (Src != NULL ...

  4. 字符串函数实现(strlen,strcpy,strcmp,strcat,strrev)

    声明:以下代码可能并非最佳方法,若有错误疑问欢迎提出!!! strlen函数 #include<stdio.h> #include<string.h>int mylen(cha ...

  5. strlen函数,strcpy函数,strcat函数,memset函数,strcmp函数,memcpy函数,memove()函数

    文章目录 一,strlen函数(库函数头文件<string.h>) 二,strcpy函数(库函数头文件<string.h>)拷贝函数 三,strcat函数(头文件是<st ...

  6. 字符串函数:strlen函数,strcpy函数,strcat函数,strcmp函数

    目录: 1.字符串函数strlen (1)strlen函数 (2)strlen的使用 a.代码 b.运行结果 (3)模拟实现strlen函数 a.代码 b.运行结果 (4)注意: 2.字符串函数str ...

  7. C语言常用字符串操作函数大全详解(strstr,strtok,strrchr,strcat,strcmp,strcpy,strerror,strspn,strchr等)

    参考:string.h中常用字符串操作函数说明(strstr,strtok,strrchr,strcat,strcmp,strcpy,strerror,strspn,strchr等) 作者:一只青木呀 ...

  8. C语言之字符串探究(三):字符串库函数操作——strlen、strcat、strcpy、strcmp

    相关博文:C++之char和string字符串类探究 相关博文:C语言之数组探究(一):定义.大小.初始化.访问和三要素 相关博文:C语言之字符串探究(一):字符串与字符数组 相关博文:C语言之字符串 ...

  9. C语言之字符串探究(二):字符串原生操作——strlen、strcat、strcpy、strcmp自实现

    相关博文:C++之char和string字符串类探究 相关博文:C语言之数组探究(一):定义.大小.初始化.访问和三要素 相关博文:C语言之字符串探究(一):字符串与字符数组 相关博文:C语言之字符串 ...

最新文章

  1. 美多商城之验证码(短信验证码2)
  2. php多表数据排除,thinkphp中多表查询中防止数据重复的sql语句(必看)
  3. 安装python缺少dll_解决Python安装时报缺少DLL问题【两种解决方法】
  4. 获300万美元融资!Dgraph宣布:其图数据库正式发布!
  5. Struts2中配置默认Action
  6. 给工厂分配销售组织/分销渠道
  7. 向量时钟Vector Clock in Riak
  8. C++高手总结的编程规律
  9. 超大气APP下载页双语多国语言网站源码
  10. fastjson和json-lib的区别
  11. 华为云张昆:支持全场景全业务,GaussDB加速企业数字化转型
  12. 【clickhouse】clickhouse NO DELAY, INTO OUTFILE, SETTINGS, ON, FORMAT, Dot, SYNC, token
  13. mac下载站,这个可以收藏看看
  14. 【数据分享】错颌畸形生长患者治疗数据集
  15. 计算机病毒的一些印象
  16. MD5加密概述,原理及实现
  17. Linux基础知识点总结
  18. HTML+css实现元素居中对齐的方法
  19. js:使用angular的http获取json数据
  20. iCCP: cHRM chunk does not match sRGB

热门文章

  1. 什么是「文本基因计划」?
  2. 第九届信安技能赛BATV提供20万奖学金,助力i春秋大学生成长计划
  3. python海象运算符_【译】Python3.8新语法:海象运算符
  4. 数据库之如何优化数据库,提高数据库的性能?
  5. 大话设计模式——装饰者模式
  6. 手把手教你python--爬取网站首页(学生必看)
  7. ppt打印一页6张铺满不留白_赌5毛钱,这绝对是你一直想学但找不到教程的3D特效PPT玩法...
  8. 疯狂Android讲义(第3版)学习笔记(第二章---界面编程)
  9. 百度语音识别、语音合成,NAudio录音(C#)
  10. VS2010安装包制作 [桌面快捷图标 右键属性 打开文件位置]问题解决