码海拾遗:strstr()和strcpy()实现

  1、strstr()实现

  原型:char * strstr(const char * str1, const char * str2)

  说明:判断str2是否为str1的子串,如果是则返回str2第一次出现的位置,否则返回NULL

  实现:

 1 char * strstr(const char * str1, const char * str2)
 2 {
 3     if (NULL == str1 || NULL == str2)
 4         return NULL;
 5
 6     while (*str1++ != ‘\0‘)
 7     {
 8         for (int i = 0; *(str1 + i) == *(str2 + i); ++i)
 9             if (*(str2 + i + 1) == ‘\0‘)
10                 return (char*)str1;
11     }
12     return NULL;
13 }

  2、strcpy实现

  原型:char* strcpy(char *dst, const char *src)

  说明:把从src地址开始且含有‘\0‘结束符的字符串复制到以dest开始的地址空间

  实现:

 1 char * memcpy(char * dst, const char * src, unsigned len)
 2 {
 3     if (NULL == dst || NULL == src)
 4         return NULL;
 5
 6     char *rtn = dst;
 7
 8     if (dst >= src && dst <= src + len - 1)//考虑到可能出现部分地址重叠
 9     {
10         src += len - 1;
11         dst += len - 1;
12         while (len--)
13             *dst-- = *src--;
14     }
15     else
16         while (len--)
17             *dst++ = *src++;
18
19     return rtn;
20 }
21
22 unsigned strlen(const char *str)
23 {
24     if (NULL == str)
25         return -1;
26
27     unsigned len = 0;
28     while (*str++ != ‘\0‘)
29         len++;
30
31     return len;
32 }
33
34 char* strcpy(char *dst, const char *src)
35 {
36     if (NULL == dst || NULL == src)
37         return NULL;
38
39     char *rtn = dst;
40     memcpy(dst, src, strlen(src)+1);
41     /*等同于
42     memcpy(dst, src, strlen(src));
43     dst[strlen(src)] = ‘\0‘;
44     */
45     return rtn;
46 }

  PS: 既然是自己实现这两个函数,就不用C标准提供的函数了

时间: 2024-08-10 19:17:16

码海拾遗:strstr()和strcpy()实现的相关文章

码海拾遗:strcpy()、strncpy()和strcpy_s()区别

1.strcpy() 原型:char *strcpy(char *dst,const char *src) 功能:将以src为首地址的字符串复制到以dst为首地址的字符串,包括'\0'结束符,返回dst地址.要求:src和dst所指内存区域不可以重叠且dst必须有足够的空间来容纳src的字符串,若dst空间不足,编译时并不会报错,但执行时因系统不同会出现不同的结果:Mac系统提示"Abort trap:6"(Mac):CentOS7系统会正常运行(可能是个例,可以正常运行) 测试代码:

码海拾遗:内存四区

C/C++编写的程序在分配内存时,通常划分为四个区域: 栈区(stack):存放函数的参数值.局部变量的值等,通常由编译器自动分配和释放 堆区(heap):动态分配的内存空间,由程序员分配和释放.若程序员忘记释放,将造成内存泄漏 数据区: 常量区:存放常量 全局/静态区:存放全局变量和静态变量 代码区:存放可执行代码的区域 堆栈生长方向和内存存放方向: 栈:栈生长方向与数组元素存放方向相反 堆:堆生长方向与数组元素存放方向相同

码海拾遗:高并发服务器模型简述

常见的Linux并发服务器模型有:多进程并发服务器.多线程并发服务器.select多路I/O转接模型.poll多路I/O转接模型.epoll多路I/O转接模型. 1.多进程并发服务器.多线程并发服务器 多进程并发服务器考虑因素: 父进程最大文件描述符个数(父进程中需要close关闭accept返回的新文件描述符) 系统内存创建进程个数(与内存大小相关) 进程创建过多是否降低整体服务性能(进程调度) 多线程并发服务器考虑因素: 调用进程内最大文件描述符上限 如果线程中需要共享数据,则需要考虑线程同

[码海拾贝 之TC] 使用View 定义动态的Class

前言 在TC 中, Persistent Class 和 Table 是对应的关系. 定义一个Persistent的Class , updatedb 的时候就会产生对应的table. 在TC 的开发环境中, 使用一个username . 对应的会在这个username 下产生一个table 在正式环境中, 因为使用到 adm, su ,可key 三个username, 所以在这三个username 下都会生成相应的table. 具体数据保存在哪一张table 中, 就看Class 的定义是继承自

[码海拾贝 之Perl]在字符串数组中查找特定的字符串是否存在

前言 检索一个字符串是否存在于一个数组中, 最基本的想法应该就是对数组进行循环, 逐个判断数组的每个元素值和给定的值是否相等. (在Java语言还可以把数组转成 List , 在 list 中直接有 contains 方法可以使用) 看一段简单的代码: my @arr2 = qw(str1 str2 str3 str4); foreach(@arr2) { if($_ eq "str2") { print "str2 exist in Array!\n"; last

[码海拾贝 之Perl]获取日期以及日期的加减

前言 在Perl 中, 不安装其他模组的状况下, 可以使用 localtime 来获取当地日期和时间. 在标量上下文中, 返回的是字符串格式. my $localtime = localtime(); print "\n$localtime\n"; 返回: Thu Jan  1 18:17:56 2015 在列表上下文中, 返回的是描述当前时间的一个元素列表 my ($sec,$min,$hour,$mday,$mon,$year_off,$wday,$yday,$isdat) = l

[码海拾贝 之JS] JS 之删除数组中的元素

前言 在Java 中要从一个list 中删除一个元素, 直接使用 remove 方法就可以了. 在js 中的array 并没有 remove 方法, 但是在js 中array 有splice 方法可以达成相同的效果, 除此之外, 还可以使用其他方式来实现这个效果. 使用splice 方法实现从数组中删除元素 首先看一下 splice 方法如何使用. 语法 arrayObject.splice(index,howmany,item1,.....,itemX) 参数 描述 index 必需.整数,规

重写strstr、strcpy、memcpy、memset、atof算法

1 #include<stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #include <ctype.h> 5 #include <math.h> 6 7 char *Mystrstr(const char *string, const char *strCharSet) 8 { 9 if (NULL == string) 10 { 11 return (char *)string;

strcpy在centos6.x,gcc4.4.7版本上会有bug,自我移动导致覆盖错误overlap

Gcc编译时无优化参数,以前曾经被-O坑过. #include <stdio.h> #include <string.h>   int main() {        char url[512];        sprintf(url,"218.26.242.56/0/0/1023/6d6168bf1a7294ae0e1c071171adcd48.mp4");        printf("%s\n",url);        char*p