一、前言

二、实现部分库函数

(1)strlen

(2)strcpy

(3)strcmp

(4)strcat

(5)strstr

(6)memcpy

(7)memmove

一、前言

库函数一般是指编译器提供的可在c源程序中调用的函数。可分为两类,一类是c语言标准规定的库函数,一类是编译器特定的库函数。

由于版权原因,库函数的源代码一般是不可见的,但在头文件中你可以看到它对外的接口库函数简介。

C语言的语句十分简单,如果要使用C语言的语句直接计算sin或cos函数,就需要编写颇为复杂的程序。因为C语言的语句中没有提供直接计算sin或cos函数的语句。又如为了显示一段文字,我们在C语言中也找不到显示语句,只能使用库函数printf。

C语言的库函数并不是C语言本身的一部分,它是由编译程序根据一般用户的需要编制并提供用户使用的一组程序。C的库函数极大地方便了用户,同时也补充了C语言本身的不足。事实上,在编写C语言程序时,应当尽可能多地使用库函数,这样既可以提高程序的运行效率,又可以提高编程的质量。

这里调用的是静态库。

二、实现库函数

注:

这里传过去的是地址,为了以防万一,害怕传过去的是空地址,这里对每个指针进行断言。

1.strlen

(1)从库函数中可以了解到strlen函数是获取字符串的长度的一种方式。它的作用方法是读取字符串,直到读取到‘\0’,才会停止,如果不输入‘\0’或不输入字符串,直接输入几个不含‘\0’的字符,其将会往后继续读取字符,直到读取到‘\0’为止,所以可能会出现错误。

(2)这里实现是将字符串的地址传过去,并用const修饰(传过去的字符串的值不能修改),分别用两个指针指向字符串的地址,一个用于记录初始地址;一个往后读取,直到读取到‘\0’,最后返回往后读取的指针的地址减去初始地址的值。

size_t my_strlen(const char* str)
{assert(str);const char* start = str;const char* end = str;while (*end != '\0'){end++;}return end - start;
}int main()
{char arr[] = "abcdef";int len = my_strlen(arr);printf("%d\n", len);return 0;
}

2.strcpy

(1)从库函数的可以了解到strcpy是将一个字符串的值拷贝到另一个字符串的一种方式,中间要确保另一个字符串所在的空间大小可以接纳这个字符串,否则可能出现问题。它的作用原理是将对应字符串的每一个字符改为其他的字符串,也要确保传过去的值是否有‘\0’。

(2)这里实现是将这两个字符串的地址都进行传过去,要被拷贝的指针用const进行修饰(因为这个指针指向的值并不需要修改),创建一个临时变量用于保存要修改的地址,将要修改的值进行一一修改,因为读取到后面会读取到‘\0’,所以这里直接使用while循环即可。

char* my_strcpy(char* dest, const char* src)
{assert(dest);assert(src);char* ret = dest;while (*dest++ = *src++){;}return ret;
}int main()
{char arr1[30] = "Yes";char arr2[] = "No,I don't feel good.";my_strcpy(arr1, arr2);printf("%s\n", arr1);return 0;
}

3.strcmp

(1)strcmp是将两个字符串的值进行比较的一种方式,如果前一个字符串的值大于后一个字符串,则返回大于0的值;等于则返回0;小于则返回小于0的值。使用这个函数必须保证两个字符串后面有‘\0’以用于停止。

(2)这里实现是将两个字符串的地址分别传过去并用const进行修饰,因为这个指针指向的值不可以修改,这里对这两个字符串的每个一个字符串进行比较,最终返回用前一个指针指向的值减去后一个指针指向的值。

int my_strcmp(const char* str1, const char* str2)
{assert(str1 && str2);while (*str1 == *str2){if (*str1 == '\0'){return 0;}str1++;str2++;}return *str1 - *str2;
}int main()
{char arr1[30] = "Yes";char arr2[] = "No,I don't feel good.";int ret = my_strcmp(arr1, arr2);printf("%d\n", ret);return 0;
}

4.strcat

1)strcat函数是在一个字符串的末尾即从‘\0’开始往后进行补充另一个字符串的值,这两个字符串都必须要有‘\0’结尾,否则可能出现问题。

(2)这里实现是将两个字符串的地址都传过去并用const修饰,以保证其原始值不会发生改变。先创建一个临时变量保存第一个字符串的起始位置,然后从前向后先读取第一个字符串的值,直至读到‘\0’位置,然后将‘\0’及其后面的值一 一改为另一个字符串的值,知道读取到下一个字符串中‘\0’的位置,最终返回第一个字符串的地址。

char* my_strcat(char* dest, const char* src)
{char* ret = dest;while (*ret != '\0'){ret++;}while (*ret++ = *src++){;}return dest;
}int main()
{char arr1[30] = "No,";char arr2[] = "I don't feel good.";my_strcat(arr1, arr2);printf("%s\n", arr1);return 0;
}

5.strstr

(1)strstr函数是在一个字符串中寻找另一个字符串及找子串,并返回指向 str2 中指定的整个字符序列中 str1 中第一个出现的指针,如果 str1 中不存在该序列,则为空指针。

(2)这里实现是先将两个字符串进行传址调用,这里使用的是c语言版本,未对其进行重载。先对要找的子串的地址分别用两个临时变量进行保存,将要查询的父串进行传参给另一个临时变量,如果要找的子串指向的是‘\0’,则直接返回子串。用子串的第二个临时变量其解引用后的值作为循环的判断条件,然后遍历这两个字符串,如果找到了则直接返回 t 的地址,如果找不到则直接返回空指针。


const char* my_strstr(const char* str1, const char* str2)
{char* s1 = str1;char* s2 = str2;char* t = str1;if (*s1 == '\0'){return str1;}while (*t){s1 = t;s2 = str2;while (s1 != '\0' && s1 == s2){s1++;s2++;}if (*s2 == '\0'){return (char*)t;//找到了}t++;}return NULL;//找不到子串
}int main()
{char arr1[30] = "No,";char arr2[] = "I don't feel good.";char* t = my_strstr(arr1,arr2);if (t == NULL){printf("不存在\n");}else{printf("%s\n", t);}return 0;return 0;
}

6.memcpy

1)memcpy函数是将数字字节的值从指向的位置直接复制到目标所指向的内存块,并且可以传输字符串以外的值,并不用读取到空字符串,才会停止,而是给予相应的值判断到某个位置进行停止。

(2)这里实现是将两个整形数组进行传址,并创建一个临时变量保存要改变的值的地址,这里传一个无符号整形变量的值,并将其作为循环的条件,直到其变为0,然后将要改变的值一 一进行改变,最终返回要改变的数组的起始地址。

#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>void* my_memcpy(void* dest, void* src, size_t num)
{void* a = dest;assert(dest);assert(src);while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)src + 1;}return a;
}int main()
{int arr1[20] = { 1,2,3,4,5,6 };int arr2[] = { 2,3,4,5,6,7,8 };int n = 0;scanf("%d", &n);my_memcpy(arr1, arr2, n);for (int i = 0; i < 10; i++){printf("%d ", arr1[i]);}return 0;
}

7.memmove

(1)memmove函数主要是实现将数字字节的值从指向的位置复制到目标所指向的内存块。复制就像使用了中间缓冲区一样进行,从而允许目标和重叠。

(2)这里实现是直接将一个数组的两个地址传输,然后创建一个临时变量用于保存要改变的量的起始地址,然后判断这两个地址的大小,要是要改变的地址小于要拷贝的地址,则直接进行memcpy的操作即可,要是大于,则要先改变指针指向部分后面的值,以防止修改前面部分的值,而导致后面要拷贝的值发生改变即不能完成正确的拷贝。

void* my_memmove(void* dest, void* src, size_t num)
{char* ret = dest;assert(dest);assert(src);if (dest < src){while (num--){*(char*)dest = *(char*)src;dest = (char*)dest + 1;src = (char*)dest + 1;}}else{while (num--){*((char*)dest + num) = *((char*)src + num);}}return ret;
}int main()
{int arr[] = { 1,2,3,4,5,6,7,8,9,10 };int n = 0;scanf("%d", &n);my_memmove(arr + 3, arr, n);for (int i = 0; i < 10; i++){printf("%d ", arr[i]);}return 0;
}

实现部分库函数(strlen、strcpy、strcmp、strcat、strstr...)相关推荐

  1. C语言库函数的实现(strlen strcpy strcmp strcat strstr)

    库函数的实现 strlen strcpy strcmp strcat strstr assert函数 头文件:assert.h 又称断言语句,可以看做是功能缩小版的 if 语句,它用于判断某个表达式的 ...

  2. C基础--字符串操作函数(strlen,strcpy,strcmp,strcat,strstr,strtok,strchr)

    #include <stdio.h> #include <string.h> int main(void) {//char dest[10];//#define NULL (v ...

  3. strlen, strcpy,strcmp,strcat,strncpy,strncmp,strncat,strst库函数的详细解析以及模拟实现

  4. strlen,strcpy,strcmp,strcat,strncpy,strncmp,strncat

    写在前面:本文比较长,覆盖了c语言中较多的字符串函数,作者会先带各位了解标准库对函数的介绍,然后模拟实现相关功能. strlen 求字符串长度 size_t表明返回一个无符号类型的数字,是因为考虑到l ...

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

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

  6. c语言strcpy两字符串长度不同,(C语言)自己写字符串操作函数(一)——strlen/strcpy/strcat/strcmp/st...

    看到很多面试都会要求你写一些简单的字符串操作函数,这些函数看起来挺简单的,但是自己写的时候就会发现不少的问题.所以我自己把大部分的字符串操作函数都写了一遍,然后用了个测试程序来测试自己写的函数与库函数 ...

  7. c语言 strcpy原型,浅谈C语言中strcpy,strcmp,strlen,strcat函数原型

    实例如下: //strcat(dest,src)把src所指字符串添加到dest结尾处(覆盖dest结尾处的'\0')并添加'\0' char *strcat(char * strDest, cons ...

  8. C和指针之字符串之strlen、strcpy、 strcat、strcmp使用总结

    1.常见字符串相关操作 我们知道有strlen. strcpy.strcat.strcmp.这样一一系列函数 2.实现Demo #include <stdio.h> #include &l ...

  9. (C语言)常用的字符串函数介绍(strcpy,strncpy,strcat,strncat,strcmp,strncmp,strchar,strlen)非常详细

    理解 strcpy,strncpy,strcat,strncat,strcmp,strncmp,strchar,strlen这些函数,可以帮助我们更好的对字符串进行操作,做到玩转字符串. 目录 1.s ...

  10. C语言字符串库函数strcpy,strncpy,strcat,strncat,ctrcmp,strncmp的简介与实现

    目录 一.C语言部分字符串库函数的介绍 1.strcpy函数的介绍 2.strncpy函数的介绍 3.strcat函数的介绍 4.strncat函数的介绍 5.strcmp函数的介绍 6.strncm ...

最新文章

  1. 【视频】视频方面大神博客总结
  2. addslashes 及 其他 清除空格的方法是不安全的
  3. css和JavaScript实现的星云动画效果
  4. 第4篇:Flowable快速工作流脚手架Jsite_启动项目
  5. PCA的本质----特征值分解
  6. EfficientPS:目前排名第一的高效高精度全景分割算法
  7. vue-cli本地的一个websocket
  8. 苹果公司反诉堡垒之夜开发商Epic,寻求惩罚性赔偿
  9. ReactNative项目xcode打包运行报错整理
  10. Eclipse中 Clean 的时候总是警告 org.apache.catalina.webresources.Cache backgroundProcess
  11. spss数据预处理步骤_5个步骤,用SPSS进行数据分析
  12. Python练习题19:《沉默的羔羊》之最多单词
  13. 一步步用python制作游戏外挂
  14. 42. 注入篇——Havij、Pangolin使用
  15. appfuse 1.9.2 的AOB (面向方面的bug)
  16. c语言作业 电影院选座系统,c语言编程 电影院票务系统.wps
  17. go实践二十 web开发--表单唯一token 表单验证 防止xss攻击 上传文件 cookie处理
  18. 大唐豪侠 -架构开发纪实
  19. pythoc_autocad_标注_all_横线_竖线
  20. c语言中置逆三位正整数,C语言程序设计 – 第 05 章课后习题(11页)-原创力文档...

热门文章

  1. 搭建Babel运行环境,Traceur ES6模板,块级作用域,let和const命令
  2. 关于Angular2.0 in-memory-web-api的GET http://localhost:3000/traceur 404 (Not Found)等错误的解决方法之一
  3. 疫情时期的程序员爱情,看完我酸了!
  4. BMC固件漏洞导致OT和IoT设备易受远程攻击
  5. elasticsearch flattened 不支持 numeric range 却又支持 range查询?
  6. 术语翻译html,俄语翻译术语的词义处理方法
  7. html中a标签的target属性值iframe
  8. 《惢客创业日记》2020.06.30(周二)《隐秘的角落》中的原罪
  9. Android:Handler学习总结
  10. srm采购管理系统的基础功能