关关难过关关过

前路漫漫亦灿烂

今天 阿紫 就带领大家一起挑战字符串函数的模拟实现


目录

1.模拟实现strlen

1.1函数介绍

1.2函数的模拟实现

2.模拟实现strcpy

2.1函数介绍

2.2函数模拟实现

3.模拟实现strcat

3.1函数介绍

3.2函数模拟实现

4.模拟实现strcmp

4.1函数介绍

4.2函数模拟实现

5.模拟实现strstr

5.1函数介绍

5.2函数的模拟实现

6.了解strtok

6.1函数介绍

6.2函数使用

7.了解strerror

7.1函数介绍

7.2函数使用


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

字符串常量:适用于那些不做修改字符串函数,因为字符串常量是常量,常量是不允许被修改的,它存放在常量区

1.模拟实现strlen

1.1函数介绍

strlen:求字符串长度

注:字符串以 \0 作为字符串结束标志,strlen 函数返回的是 \0 之前的字符个数,不包含 \0

1.2函数的模拟实现

我们既然要模拟实现 strlen 函数,就得模拟的像一点,我们可以通过查询找到 strlen 函数的形式,通过查找,我们可以发现函数的参数是一个字符指针类型,返回值是 size_t (无符号整型)

#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{assert(str != NULL);size_t ret = 0;while (*str++ != '\0'){ret++;}return ret;
}
int main()
{char arr[] = "abcdef";int ret = my_strlen(arr);printf("%d\n", ret);return 0;
}

分析:函数参数前面加上 const  是避免误改字符串,因为我们只需要计算它的长度不需要改变。返回值为 size_t 因为长度不可能为负数,所以设为 size_t 最合理。*str++ != '\0' 的运算:首先先对 str 解引用找到对应的字符然后与 \0 比较,如果不等于 \0 就 str++ 指向下一个字符,然后依次循环,直到 *str 等于 \0 然后跳出。


2.模拟实现strcpy

2.1函数介绍

strcpy:字符串拷贝函数,将一个字符串的内容拷贝到另一个字符串中

2.2函数模拟实现

通过查询 strcpy 函数,我们可以发现 strcpy 函数有两个参数分别都是指针类型,第一个指针指向的是目标空间,第二个指针指向的是源字符串,我们要把源字符串拷贝到目标空间中,所以目标空间要足够大,能存储的下源字符串,并且可修改。

#include<stdio.h>
#include<assert.h>
char* my_strcpy(char* dest, const char* source)
{assert(dest != NULL);assert(source != NULL);char* ret = dest;while (*dest++ = *source++){;}return ret;
}
int main()
{char arr1[20] = { 0 };char arr2[] = "abc";my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}

分析:返回类型是 char*,我们用一个字符指针变量指向目标首地址,为了避免 dest 在后面指向的时候会改变指向的位置。把 *source 里面的字符 赋给 *dest ,然后在进行 while 判断,如果不为 \0 就后置++

思考:在字符串拷贝的时候会把源字符串的 ‘\0’ 拷贝进去嘛?

通过调试,我们可以知道拷贝时会把 ‘\0’ 拷贝进去。

3.模拟实现strcat

3.1函数介绍

strcat:字符串追加函数,将一个字符串追加到另一个字符串的后面

3.2函数模拟实现

通过查询 strcat 函数,我们可以发现 strcat 函数有两个参数分别都是指针类型,第一个指针指向的是目标空间,第二个指针指向的是源字符串,我们要把源字符串追加到目标空间中,所以目标空间要足够大,能存储的下追加的源字符串,并且可修改

#include<stdio.h>
#include<assert.h>
char* my_strcat(char* dest, const char* source)
{assert(dest != NULL);assert(source != NULL);char* ret = dest;while (*dest != '\0'){dest++;}while (*dest++ = *source++){;}return ret;
}
int main()
{char arr[20] = "abc";char brr[] = "def";my_strcat(arr, brr);printf("%s\n", arr);return 0;
}

分析:找到目标空间 '\0' 的位置,然后将源字符串的字符依次追加到目标空间里面,目标空间的 ‘\0’ 是会被替换掉的,直到源字符串赋值到 ‘\0’ 给目标空间就结束追加。

思考:字符串可以自己给自己追加嘛?

结论:strcat 不可以自己给自己追加,因为一旦自己给自己追加就改变了 '\0',那么就一直追加下去,程序就会造成死循环

4.模拟实现strcmp

4.1函数介绍

strcmp:字符串比较函数,是用来比较两个字符串大小的函数。

很多人会误以为字符串比较跟整型比较的方法一样,这是不正确的

结论:上述代码充分证明了,字符串不能跟整型数据一样比较,那字符串与字符串怎么比较呢,字符串与字符串用 strcmp 函数来比较。

4.2函数模拟实现

函数参数是两个指针,分别指向着两个需要比较的字符串,因为只需要比较不需要改变,所以前面加上了 const 。返回值为 int ,第一个字符串大于第二个字符串,则返回大于 0 的数字;第一个字符串等于第二个字符串,则返回0;第一个字符串小于第二个字符串,则返回小于0的数字。

#include<stdio.h>
#include<assert.h>
int my_strcmp(const char* str1, const char* str2)
{assert(str1 != NULL);assert(str2 != NULL);while (*str1 == *str2){if (*str1 == '\0' && *str2 == '\0'){return 0;}str1++;str2++;}return *str1 - *str2;
}
int main()
{char arr[] = "abcdef";char brr[] = "abc";int ret = my_strcmp(arr, brr);if (ret > 0){printf(">\n");}else if (ret == 0){printf("==\n");}else{printf("<\n");}return 0;
}

分析:首先如果*str1 == *str2 ,就进入循环判断它们是否都为 '\0' ,如果是说明它们两个都结束了,且相等,那么就返回 0。否则就 str1++,str2++ 比较下一个字符是否相等,如果不相等就直接退出循环,返回 *str1 - *str2,如果返回的结果为负数,说明 *str1 小于 *str2,否则大于

5.模拟实现strstr

5.1函数介绍

strstr:在一个字符串中找子串,例如 “abcdef”,找子串“def”,如果 “def” 在这个字符串中,则返回在这个字符串中找到子串的第一个字符的地址

5.2函数的模拟实现

函数参数分别是两个字符指针类型,分别指向了两个字符串,第二个字符串叫做子串,就在第一个字符串中找子串,如果找到则返回在第一个字符串中查找的子串的第一个字符的地址。

#include<stdio.h>
#include<assert.h>
char* my_strstr(const char* str1, const char* str2)
{assert(str1 && str2);char* s1 = str1;char* s2 = str2;char* p = str1;while (*p){s1 = p;s2 = str2;while (*s1 == *s2 && *s1 != '\0' && *s2 != '\0'){s1++;s2++;}if (*s2 == '\0'){return p;}p++;}return NULL;}int main()
{char arr[] = "abcdefg";char brr[] = "def";char* ret = my_strstr(arr, brr);printf("%s\n", ret);return 0;
}

情况一:直接找到,然后对 s1s2 解引用 比较,当 *s2 == '\0' 时,说明查找完毕找到了。如果找不到,当 *p == ‘\0’ 退出循环,也就说明没有找到

情况二:找多次找到,第一次找到了 ' b'  ,*s1 和 *s2 都是 'b',当 s1++s2++,解引用然后它们里面的字符不相同了。然后 p 指向下一个字符,s1 = ps2 回到它第一个字符的位置,然后在找到与 s2 相同的字符然后在比较,直到 *s2 == '\0' 时,说明查找完毕找到了。如果找不到,当 *p == ‘\0’ 退出循环,也就说明没有找到

6.了解strtok

6.1函数介绍

strtok:字符串分割函数

6.2函数使用

  • delimiters 参数是个字符串,定义了用作分隔符的字符集合。
  • 第一个参数指定一个字符串,它包含了0个或者多个由 delimiters 字符串中一个或者多个分隔符分割的标记。
  • strtok函数找到str中的下一个标记,并将其用 \0 结尾,返回一个指向这个标记的指针。(注: strtok函数会改变被操作的字符串,所以在使用strtok函数切分的字符串一般都是临时拷贝的内容 并且可修改。)
  • strtok函数的第一个参数不为 NULL ,函数将找到str中第一个标记,strtok函数将保存它在字符串 中的位置。
  • strtok函数的第一个参数为 NULL ,函数将在同一个字符串中被保存的位置开始,查找下一个标 记。
  • 如果字符串中不存在更多的标记,则返回 NULL 指针。
#include <stdio.h>
#include <string.h>
int main()
{char *p = "I.LOVE@YOU";const char* sep = ".@";char arr[30];char *str = NULL;strcpy(arr, p);//将数据拷贝一份,处理arr数组的内容for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep)){printf("%s\n", str);}
}

7.了解strerror

7.1函数介绍

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

7.2函数使用

#include <stdio.h>
#include <string.h>
#include <errno.h>//必须包含的头文件
int main()
{FILE * pFile;pFile = fopen("aaa.txt", "r");if (pFile == NULL)printf("Error opening file unexist.ent: %s\n", strerror(errno));//errno: Last error numberreturn 0;
}

目前我没有创建 aaa.txt 文件,这个程序就会将错误码转换为错误信息打印出来。

【c语言】模拟实现字符串函数(上)相关推荐

  1. 用C语言模拟实现字符函数与字符串函数

    用C语言模拟实现字符函数与字符串函数 strncat.strncpy.atoi 若使用本文相关代码,还请动手点个赞!!! #define _CRT_SECURE_NO_WARNINGS 1 #incl ...

  2. C语言常用的字符串函数

    C语言常用的字符串函数 以下函数都在头文件 string.h 中 (1)strcpy()字符串复制函数 函数原型:char *strcpy(char *d ,char *s) 功能:复制字符串s到字符 ...

  3. C语言试题六十二之请编写函数fun除了字符串前导和尾部的*号之外,将串中其他*号全部删除。形参h已指向字符串第一个字母,形参p已指向字符串中最后一个字母。在编写程序时,不得使用c语言提供的字符串函数。

    1. 题目 请编写函数fun除了字符串前导和尾部的*号之外,将串中其他*号全部删除.形参h已指向字符串第一个字母,形参p已指向字符串中最后一个字母.在编写程序时,不得使用c语言提供的字符串函数. 比如 ...

  4. C语言试题五十七之假定输入的字符串中只包含字母和*号。请编写函数function,它的功能是:删除字符串中所有*号。在编写函数时,不得使用c语言提供的字符串函数。

    1. 题目 假定输入的字符串中只包含字母和*号.请编写函数function,它的功能是:删除字符串中所有*号.在编写函数时,不得使用c语言提供的字符串函数. 2 .温馨提示 C语言试题汇总里可用于计算 ...

  5. 87.假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了字符串前导的*号之外,将串中其他*号全部删除。在编写函数时,不得使用C语言提供的字符串函数。

    87.假定输入的字符串中只包含字母和号.请编写函数fun,它的功能是:除了字符串前导的号之外,将串中其他*号全部删除.在编写函数时,不得使用C语言提供的字符串函数. 例如,若字符串中的内容为****A ...

  6. 66.假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:删除字符串中所有的*号。在编写函数时,不得使用C语言提供的字符串函数。

    66.假定输入的字符串中只包含字母和号.请编写函数fun,它的功能是:删除字符串中所有的号.在编写函数时,不得使用C语言提供的字符串函数. 例如,若字符串中的内容为****A*BC*DEFG***** ...

  7. C语言--模拟实现strncpy函数

    C语言–模拟实现strncpy函数 一.strncpy说明 strncpy格式如下 char* strncpy(char* destination, const char* source, size_ ...

  8. 【C语言进阶】字符串函数模拟实现

    求字符串长度 strlen size_t strlen(const char*string); 头文件:<string.h> 功能: 计算字符串的长度,遇到'\0'便停止,统计'\0'之前 ...

  9. c语言让参数等于空字符串,C语言模拟实现字符串操作函数

    前言 在编写程序过程中,我们经常使用到一些字符串函数,例如求字符串长度,拷贝字符串--,这些函数都在C标准库中存在,我们可以直接使用.但我们还需要掌握这些函数的实现方法,今天来看看一些常用的字符串操作 ...

最新文章

  1. Java中byte与16进制字符串的互相转换
  2. VScode配置anaconda虚拟环境+运行
  3. BPF Tools 参考链接
  4. DL之NN:利用(本地数据集50000张数据集)调用自定义神经网络network.py实现手写数字图片识别94%准确率
  5. b站上java和python视频可以吗_b站有哪些好的java视频?
  6. 频频转型的蘑菇街,能讲好直播这个“老故事”吗?
  7. git gui怎么拉取项目代码_Git可视化极简易教程 —— Git GUI使用方法
  8. sizeof string
  9. 基于IdentityServer的系统对接微信公众号
  10. Android 应用基础知识(6)---本地化
  11. 英语发音规则---C字母
  12. 应用程序拒绝访问_让你的ASP.NET Core应用程序更安全
  13. centos 安装nodejs与vue手脚架安装
  14. Linux 权限设置
  15. 微软职位内部推荐-Software Engineer II-Senior Software Engineer for Satori
  16. DPDK - TX-Offload Checksum
  17. 终极算法【3】——符号学派
  18. MS Office/Visio 2003 sp1 下载
  19. 把图片放大清晰度不变的方法
  20. CSDN如何开启版权声明

热门文章

  1. win7安装驱动-EKK-LM3S8962
  2. 基站,小区,扇区,载频之间的关系
  3. Airbnb如何培养对客户的同理心
  4. FMEA:五大核心质量工具之FMEA
  5. 经典电子书(转)免费下载
  6. 【数据分析】业务分析中常见模型-波士顿矩阵、逻辑回归模型
  7. 3. 什么是JSR参考实现? - JavaEE基础系列
  8. Kafka与Spark集成系列二Spark的安装及简单应用
  9. 深入计算机组成原理(二十二)冒险和预测(一):hazard是“危”也是“机”
  10. 【每日一问】什么是API?