在C语言标准库里面,存在一个对字符串数组进行操作的函数的头文件为string.h。

常用的字符串函数有strlen,strcpy,strcat等等。

了解这些字符串函数是如何实现的可以有助于更好的使用这些字符串函数,并且可以加深对C语言的理解。

strlen

strlen是获得一个字符串的有效长度,注意计算大小时不包括'\0'。

下面是C语言官方所给出的声明和解释:

strlen的返回值是size_t,是一个无符号整型。形参用const修饰*str,防止*str被修改。

strlen的模拟实现

计数法:

size_t my_strlen_1(const char* arr)
{assert(arr);//断言,防止空指针size_t count=0;while (*arr != '\0'){arr++;count++;}return count;
}

递归法:

size_t my_strlen_2(const char* arr)
{assert(arr);if(*arr=='\0')return 0;return my_strlen2(++arr)+1;
}

两种方法都可以计算出一个字符串的长度

strcpy

strcpy是将字符串拷贝至目标空间内,原字符串必须包含'\0',且目标空间足够存入该字符串。

同样的给出C语言官方所给出的声明和解释:

注意strcpy有返回值,返回值为目标空间的首元素地址。

strcpy的模拟实现

char* mystrcpy(char* des, const char* str)
{assert(des&&str);char* tmp = des;//先保存一下原地址while (*str != '\0'){*des = *str;des++;str++;}*des = '\0';//最后将'\0'也拷贝过去return tmp;
}

strcat

strcat是将一个字符串拼接到另一个字符串的后面,要求目标空间足够大。

给出C语言官方所给出的声明和解释:

该函数是将source所指向的字符串拷贝到destination指向的字符串的后面,返回目标空间的首元素地址。

strcat的模拟实现

char* mystrcat(char* des, const char* source)
{assert(des&&source);char* tmp=des;while (*des!= '\0')//先找到目标字符串的'\0'des++;while (*source!= '\0')//将字符串拷贝值目标函数末尾{*des= *source;des++;source++;}*des= '\0';//将'\0'也给目标字符串return tmp;
}

strcmp

strcmp逐位比较两个字符串,如果第一个字符串大于第二个字符串返回大于零的数;如果第一个字符串小于第二个字符串返回小于零的数;如果二者相等则返回0。这个大于小于指的是ASCII码值,也就是逐位比较字符的ASCII码值。

给出C语言官方所给出的声明和解释:

 strcmp的模拟实现

int mystrcmp(const char* str1,const char* str2)
{assert(str1&&str2);while (1){if (*str1 == '\0'&& *str2 == '\0')//如果都到结尾,说明两个子串相等{return 0;}else if (*str1 == *str2)//如果相等继续向后判断{str1++;str2++;}else if (*str1 > *str2)return 1;elsereturn -1;}
}

strstr

查找字符串中的子串,返回被查找字符串中子串首元素地址。

给出C语言官方所给出的声明和解释:

从官方的文档中可以看出strstr有两种类型,一种是被const修饰,一种未被const修饰,实现功能一样,只是存在一定的权限问题;在str1里面查找是否存在str2子串,如果没有找到则返回空值。

strstr的模拟实现

const char* mystrstr(const char* str1, const char* str2)
{assert(str1&&str2);const char*pa = str1;const char*pb = str2;if (*str1 == '\0')//规定如果查找空字符,返回原字符串return str1;while (*str1 != '\0'){while (*pb != '\0'&&*pa != '\0'){if (*pa == *pb)//逐个比较{pa++;pb++;}elsebreak;}if (*pb == '\0')return arr1;//返回字符串子串首元素地址if (*pa == '\0')//避免进行不必要的计算return NULL;str1++;pa = str1;pb = str2;}return NULL;
}

除了上面的常用的字符串函数,string.h里面还包含一些对内存操作的函数,也非常的好用例如memcpy、memmove、memset等等

memcpy

memcpy是将source指向的空间里面的内容按字节拷贝到destination所指向的空间,共拷贝num个字节,并返回目标地址;

给出C语言官方所给出的声明和解释:

这里采用void*指针,说明该指针可以指向任意类型的地址,也就说是说,无论什么类型的元素都可以拷贝,直接访问地址进行拷贝。

memcpy的模拟实现

void* mymemcpy(void* str1, const void* str2, int size)//size字节数
{assert(str1&&str2);for (int i = 0; i < size; i++){*((char*)str1+ i)  = *((char*)str2+ i);}return str1;
}

这里需要强制类型转换,将任意类型的地址转换成char*,这样每次步进都是一个字节,就可以逐字节拷贝。

memset

memset是对指定内存空间写入num个字节,注意写入的值为int类型,只能写入整型,返回值为void*。

同样给出C语言官方所给出的声明和解释:

这里写入的值虽然是int类型,但是在具体实现的过程中,会存在截断,高24位会截断。

memset的模拟实现

void* mymemset(void* ptr,int val,size_t num)
{assert(ptr);unsigned char ch = val;//截断,只保留8位无符号类型for(size_t i=0;i<num;i++){*((char*)ptr+i) = ch;}return ptr;
}

memcmp、memmove等具体功能可以查看cplusplus.com - The C++ Resources Network

具体的实现方式和上面类似,不在阐述。

C语言常用字符串函数详解相关推荐

  1. 【C语言】字符串函数详解

    hello~~,我是~小鹿 ,这是我的第一篇博客,没有循序渐进从基础开始写,只是最近在学习这里就写了,比较随心吧.希望这一篇博客能够给你带来帮助,之后也会继续写的,只是可能没有循序渐进,会比较杂七杂八 ...

  2. 【python基础】python中常用字符串函数详解

    文章目录 1 字符串查询(index,find) 2. 字符串大小写转换操作(upper.lower.swapcase.capitalize和title) 3. 字符串对齐(center,just和z ...

  3. Numpy_06_字符串处理(常用字符串函数详解)

    1.字符串连接: np.char.add() ''' np.char.add(x1, x2)1.x1.x2两个数组必须要有相同的形状 2.x1.x2两个数组对应位置的元素进行拼接 3.返回的数据类型取 ...

  4. 字符函数和字符串函数详解(二)strncpy strncat strncmp strstr strtok(及其模拟实现)

     系列文章目录 字符函数和字符串函数详解(一)strlen strcpy strcat strcmp 字符函数和字符串函数详解(二)strncpy strncat strncmp strstr str ...

  5. mysql的聚合函数综合案例_MySQL常用聚合函数详解

    一.AVG AVG(col) 返回指定列的平均值 二.COUNT COUNT(col) 返回指定列中非NULL值的个数 三.MIN/MAX MIN(col):返回指定列的最小值 MAX(col):返回 ...

  6. C语言常用字符串函数strlen、strcpy、strcat、strcmp、strchr

    C语言常用字符串函数,求串长strlen(char *s).串复制strcpy(char *s1,char *s2).串连接strcat(char *s1,char *s2).串比较strcmp(ch ...

  7. c语言中快排函数,c语言快排函数详解

    c语言快排函数详解 int cmp(const void *a, const void *b) 返回正数就是说 cmp 传入参数第一个要放在第二个后面, 负数就是传入参数第一个要放第二个前面, 如果是 ...

  8. C语言-入门级别函数详解

    C语言-入门级别函数详解 写在开始 关于函数 1. 函数的定义形式 2.函数的声明 3. 返回语句 4.函数参数 4.1 形式参数(传值调用) 4.2 实际参数(传址调用) 4.3无参数 5.函数的调 ...

  9. 常用socket函数详解

    常用socket函数详解 关于socket函数,每个的意义和基本功能都知道,但每次使用都会去百度,参数到底是什么,返回值代表什么意义,就是说用的少,也记得不够精确.每次都查半天,经常烦恼于此.索性都弄 ...

最新文章

  1. linux杂谈(二十):apache服务配置
  2. libopencv_core.so: file not recognized: File format not recognized
  3. 我是架构师-基本类型-float
  4. mstsc局域网远程 要预先做的设置
  5. 量角器中Selenium定位器的完整指南(示例)
  6. laravel邮件服务
  7. hashmap扩容线程安全问题_HashMap线程不安全的体现
  8. js rsa解密中文乱码_python解析JS爬取漫画网站--动态爬虫
  9. Java数据结构和算法-二叉树
  10. 小说阅读器java源代码_Android项目源码任阅小说阅读器高仿追书神器
  11. 编译原理第一章笔记--绪论
  12. win7硬盘分区软件_系统软件
  13. wincc vbs mysql_WinCC 如何访问数据库(VBS)
  14. html5 dat.gui,Dat.gui 使用教程
  15. oracle interval加一秒,oracle 用interval时间计算_20170216
  16. 工业封装胶粘剂市场现状及未来发展趋势
  17. 微信跳一跳刷分代码剖析
  18. [人生故事] -- 美国总统的幽默
  19. 生活中的统计概率思维
  20. 走Java道路怎么样,如何学习

热门文章

  1. oracle当前毫秒时间,oracle获得当前时间,精确到毫秒并指定精确位数
  2. Android取消广播的方法名,去除Android中的角标
  3. Spring Boot入门二:Spring Boot版本;
  4. 如何快速锁定 Mac,Macbook快速锁定的几种方法
  5. jquery 删除html属性值,使用jQuery的remove()和empty()方法删除Html元素及子元素和内容...
  6. C语言编程的书写规则,关于C语言编程书写规范的规则和建议.doc
  7. PHP多功能众筹系统源码 完整代码包+搭建教程
  8. D2admin导出Execl
  9. DataNode重启
  10. 贩妖记 第七十三章,只是,不虚伪