C语言中有好多针对于字符串的函数,今天我来给大家浅谈一下我的认识以及给大家介绍一下各种函数的优缺点。

1. strcpy(字符串拷贝函数)

  • 原型声明:char *strcpy(char* dest, const char *src);
  • 头文件:#include <string.h> 和 #include <stdio.h>
  • 功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
  • 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符 串。返回指向dest的指针。
char* my_strcpy(char* dest, const char* src)
{assert(dest != NULL);assert(src != NULL);char* ret = dest;while (*dest++ = *src++){;}return ret;
}
有几点是需要注意的哈
  • 指针 src 所指向的内容是不会变的,所以需要加上 const 修饰。
  • 函数my_strcpy的返回值是指针的哈,因此函数的返回值应该为 char*。
  • 加上 asser 断言,谨防指针为空。

2. strlen(计算字符串的长度)

  • 头文件:string.h
  • 格式:strlen (字符数组名)
  • 功能:计算给定字符串的(unsigned int型)长度,不包括’\0’在内
  • 说明:返回s的长度,不包括结束符NUL。
(1). 第一种实现方式
  • 采用定义一个新变量,让它遍历字符串。此方法比较直观,但是不够具有档次。
int my_strlen(const char* arr)
{assert(arr != NULL);int count = 0;while (*arr){arr++;count++;}return count;
}
(2). 第二种实现方式
  • 这种方式采用函数递归,稍微来了一点境界,但是字符串过长的话,算法复杂度太高。
int my_strlen(const char* arr)
{assert(arr != NULL);if (*arr)return 1 + my_strlen(arr + 1);elsereturn 0;
}
(3). 第三种实现方式
  • 创建一个新指针,让这个新指针指向字符串的末尾。那么字符串的末尾指针减去初始指针就是两指针之间所包含的元素。这种方法采用指针就比较上档次了。
int my_strlen(const char* arr)
{assert(arr != NULL);char* p = arr;while (*p){p++;}return p - arr;
}
有几点是需要注意的哈
  • 指针 arr 所指向的内容是不会变的,所以需要加上 const 修饰。
  • 函数my_strlen的返回值是元素个数的哈,因此函数的返回值应该为 int。
  • 加上 asser 断言,谨防指针为空。

3. strcat(字符串拼接函数)

  • 原型 :extern char *strcat(char *dest, const char *src);
  • 头文件:在C语言中,函数原型存在 <string.h>头文件中。
  • 功能:把src所指字符串添加到dest结尾处(覆盖dest结尾处的’\0’)。
  • 说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。返回指向dest的指针。
char* my_strcat(char* dest, const char* src)
{assert(dest != NULL);assert(src != NULL);char* ret = dest;while (*dest){dest++;}while (*dest++ = *src++){;}return ret;
}
有几点是需要注意的哈
  • 指针 src 所指向的内容是不会变的,所以需要加上 const 修饰。
  • 函数my_strcat的返回值是指针的哈,因此函数的返回值应该为 char*。
  • 加上 asser 断言,谨防指针为空。

3. strstr(字符串查找子字符串函数)

  • 头文件:string.h
  • 函数原型:extern char *strstr(char *dest, const char *src);
  • 功能:* strstr(dest, src)
  • str1: 被查找目标。 str2:要查找对象
  • 返回值:若str2是str1的子串,则返回str2在str1的首次出现的地址;如果str2不是str1的子串,则返回NULL。
char* my_strstr(const char* dest, const char* src)
{assert(dest);assert(src);char* arr = (char*)dest;char* brr = (char*)src;char* p = NULL;if (*brr == '\0')  //子字符串如果为空,不用查找,直接返回空return NULL;while (*arr){p = arr;brr = src;while (*p && *brr && (*p == *brr)){p++;brr++;}if (*brr == '\0')return arr;arr++;}
}
有几点是需要注意的哈
  • 这个代码需要考虑的问题,比如 被查找的字符串中为 abbbbbbcde而要查找的子字符为bcde,这时我采用*p && *brr && (*p == *brr)这个条件来控制循环。外层的大循环采用被查找的字符串是否为空。如果要查找的字符串指向空,则返回此时被查找字符串的位置。
  • 指针dest, src 所指向的内容是不会变的,所以需要加上 const 修饰。
  • 函数my_strstr的返回值是指针的哈,因此函数的返回值应该为 char*。
  • 加上 asser 断言,谨防指针为空。

4. strchr(查找字符串 arr 中首次出现字符 c 的位置)

  • 头文件:#include <string.h>
  • 功能:查找字符串 arr中首次出现字符c的位置
  • 说明:返回首次出现c的位置的指针,返回的地址是被查找字符串指针开始的第 一个与c相同字符的指针,如果arr中不存在c则返回NULL
  • 返回值:成功则返回要查找字符第一次出现的位置,失败返回NULL
char* my_strchr(const char* arr, char c)
{assert(arr);while (*arr){if (*arr == c){return arr;}arr++;}
}
有几点是需要注意的哈
  • 指针arr 所指向的内容是不会变的,所以需要加上 const 修饰。
  • 函数my_strchr的返回值是指针的哈,因此函数的返回值应该为 char*。
  • 加上 asser 断言,谨防指针为空。

5. strcmp(字符串比较函数)

  • 头文件:#include <string.h>
  • 功能:比较两个字符串,从两个字符串的第一个字符开始比较,如果一方的字符大,那么就不往后面比较了,直接返回字符大的那个字符串。
  • 说明:设这两个字符串为str1,str2
  • str1==str2,则返回零;
  • str1<str2,则返回负数;
  • str1>str2,则返回正数。
int my_strcmp(const char * src, const char * dst)
{int ret = 0;while (!(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst )++src, ++dst;if (ret < 0)ret = -1;else if (ret > 0)ret = 1;return(ret);
}
有几点是需要注意的哈
  • 指针src dst 所指向的内容是不会变的,所以需要加上 const 修饰。
  • 函数my_strcmp的返回值是指针的哈,因此函数的返回值应该为 char*。
  • 加上 asser 断言,谨防指针为空。
  • 这里面只能比较字符串,即可用于比较两个字符串常量,或比较数组和字符串常量,不能比较数字等其他形式的参数。

6. memcpy(字符串拷贝函数)

  • 头文件:#include <string.h>
  • 功能:从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中
  • 返回值:函数返回指向dest的指针。
char* my_memcpy(void* dest, const void* src,size_t count)
{char* p = dest;while (count--){*(char*)dest = *(char*)src;++(char*)dest;++(char*)src;}//*dst = '\0';return p;
}
有几点是需要注意的哈
  • destsrc所指的内存区域可能重叠,但是如果destsrc所指的内存区域重叠,那么这个函数并不能够确保dest所在重叠区域在拷贝之前不被覆盖。而使用memmove可以用来处理重叠区域。函数返回指向src的指针.
  • 如果目标数组src本身已有数据,执行memcpy()后,将覆盖原有数据(最多覆盖n)。如果要追加数据,则每次执行memcpy后,要将目标数组地址增加到你要追加数据的地址。
  • destsrc都不一定是数组,任意的可读写的空间均可。
  • 指针src dst 所指向的内容是不会变的,所以需要加上 const 修饰。
  • 函数my_memcpy的返回值是指针的哈,因此函数的返回值应该为 char*。
  • 加上 asser 断言,谨防指针为空。

7. memmove(字符串拷贝函数)

  • 头文件:<string.h>
  • 功能:由src所指内存区域复制count个字节到dest所指内存区域。
  • 返回值:函数返回指向dest的指针。
void * my_memmove(void * dst, const void * src, size_t count)
{void * ret = dst;if (dst <= src || (char *)dst >= ((char *)src + count)) //当源内存的首地址大于等于目标内存的首地址时,实行正向拷贝{while (count--) {*(char *)dst = *(char *)src;++(char *)dst;++(char *)src;}}else                   //当源内存的首地址小于目标内存的首地址时,实行反向拷贝{dst = (char *)dst + count - 1;src = (char *)src + count - 1;while (count--) {*(char *)dst = *(char *)src;--(char *)dst;--(char *)src;}}return(ret);
}

写成这种形式也是可以的。

void* my_memmove(void* dst, const void* src, rsize_t count)
{assert(dst);assert(src);char* tmp_dst = (char*)dst;const char* tmp_src = (const char*)src;if (tmp_src < tmp_dst)    //当src地址小于dest地址时,从头进行拷贝{while (count--)*tmp_dst++ = *tmp_src++;}if (tmp_src > tmp_dst)    //当src地址大于dest地址时,从后进行拷贝{tmp_dst += count - 1;tmp_src += count - 1;while (count--)*tmp_dst-- = *tmp_src--;}//if (tmp_dst == tmp_src)  此时不进行任何操作return dst;
}
有几点是需要注意的哈
  • memmove用于从src拷贝count个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
  • 指针src 所指向的内容是不会变的,所以需要加上 const 修饰。
  • 函数my_memmove的返回值是指针的哈,因此函数的返回值应该为 void*。
  • 加上 asser 断言,谨防指针为空。
  • destsrc都不一定是数组,任意的可读写的空间均可。所以定义为void类型。

我再来说几句关于strcpy memcpymemmove的异同

  • memcpymemmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行操作。memcpymemmove拷贝多少是通过其第三个参数进行控制而strcpy是当拷贝至'\0'停止。

  • memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始位置中。memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝。

  • 关于memmove是怎么拷贝的,我再来说说。

  • 上述三种情况,memcpy可以成功对前两种进行拷贝,对第三种情况进行拷贝时,由于拷贝dst前两个字节时覆盖了src原来的内容,所以接下来的拷贝会出现错误。而memmove对第三种情况进行拷贝时会从src的最后向前拷贝N个字节,避免了覆盖原来内容的过程。

我这儿列举的函数也不多,就几个我认为重要的,我引用了百度百科的一些说法,上面的见解是我个人的一些看法,各位大神有问题的话指点指点。^_^

C语言字符串函数(strcpy,strlen,strcat,stsstr,strchr,strcmp,memcpy,memmove)相关推荐

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

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

  2. C语言字符串函数----strcpy函数

    字符串函数<string.h> strcpy函数 strcpy()把第二个字符串拷贝到第一个字符串,相当于字符串赋值运算符 函数原型 char strcpy(char dest, cons ...

  3. 如何求C语言字符串长度(strlen函数和sizeof关键字)

    如何求C语言字符串长度(strlen函数和sizeof关键字) 在程序里,一般会用***strlen()***函数或***sizeof()***来获取一个字符串的长度,但这2种方法获取的字符串的长度其 ...

  4. C语言字符串函数----strcat()函数用法

    字符串函数<string.h> strcat函数 strcat()函数用于拼接字符串 , 该函数接受两个字符串作为参数. 其函数原型 char *strcat (char *str1,co ...

  5. C语言字符串函数大全

    转载自http://www.360doc.com/content/08/0723/22/26860_1462024.shtml# C语言字符串函数大全 函数名: stpcpy 功能: 拷贝一个字符串到 ...

  6. C语言——字符串函数

    C语言--字符串函数 宗旨:技术的学习是有限的,分享的精神是无限的. 常用字符串操作函数的实现:注释部分你们注意一下,我没加/,加了/就看不到注释了. ************************ ...

  7. C语言字符串函数及如何实现这些函数

    C语言字符串函数及如何实现这些函数 ​ 近期在复习C语言字符串相关的知识,在观看了 翁恺 老师的 C语言程序设计 课程后,打算对C语言标准库以及 string.h 内的函数进行整理,并写出自己的实现方 ...

  8. 关于c语言字符串函数和一些内存函数的的简介

    关于c语言字符串函数和一些内存函数的的简介 求字符串长度的函数 strlen函数介绍![在这里插入图片描述](https://img-blog.csdnimg.cn/20190301142458376 ...

  9. c语言字符串英文,C语言字符串函数大全(国外英文资料).doc

    C语言字符串函数大全(国外英文资料) C语言字符串函数大全(国外英文资料) It's all the same -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- ...

  10. C语言中函数strcpy ,strncpy ,strlcpy的用法

    C语言中函数strcpy ,strncpy ,strlcpy的用法 http://hi.baidu.com/qi_hao/blog/item/043ef21c6e26c58286d6b678.html ...

最新文章

  1. python机器学习可视化工具Yellowbrick绘图获取最佳聚类K值实战示例
  2. UA MATH566 统计理论1 充分统计量例题答案2
  3. 《数据结构与算法》课程设计报告——赫夫曼编码/译码器
  4. 一天学完spark的Scala基础语法教程八、集合(idea版本)
  5. 如何使用Squid服务来构建=》传统和透明代理服务器,通俗易懂!
  6. 远控免杀专题9 --- Avet免杀
  7. 工作225:当前导致name报错
  8. OpenCV——基于Python开发的OpenCV安装教程
  9. WebService的相关概念
  10. 10 种跨域解决方案(附终极方案)
  11. win10巨帧数据包在哪里设置_电脑和路由器mtu值怎样设置才网速最快
  12. 手机软件测试wifi需要注意哪些问题,WiFi工作原理、测试及生产注意事项
  13. 解决crx文件扩展程序chrome下载自动删除的问题
  14. 应该从哪些方面选择适合自己的光时域反射仪?
  15. 四川大学计算机学院团委学生会,团委学生会
  16. 【原创】MacOS 上使用 Vagrant + VirtualBox 安装 Ubuntu 18.04
  17. 李兴华java开发实战经典---新IO
  18. encodeURI和decodeURI
  19. 计算机技术对视力的影响,电子屏幕对视力有哪些影响
  20. clicktorun 离线_Office2013 的 Click-to-Run 2.0 技术:新安装体验

热门文章

  1. qq数据泄露_用这个开源项目来解决你团队里猪队友泄露公司敏感信息的问题
  2. 西北农林科技大学c语言上机题题答案,西北农林科技大学C语言上机实习4答案
  3. gnuradio上怎么使用python文件_使用Python下载文件的简单示例
  4. catia圆角交点如何标注_标签软件如何制作口罩合格证
  5. Echarts:Vue3中使用Echarts
  6. JavaWeb:Filter和Listener
  7. SQL:postgresql中判断字段是否为某个值的方法IN操作符
  8. 取本周日期 C# .net
  9. redis介绍和安装
  10. 关于http协议详解(摘)