部分函数功能的实现

1:strcpy的实现

函数功能:把从src地址处开始的字符串拷贝到以dest为开始地址的空间里,

其中包含src字符串结尾处的‘\0‘。

代码实现:

#include<stdio.h>//模拟实现strcpy
#include<assert.h>
void my_strcpy(char *dest,  const char *src)/*函数不需要返回*/
{  
 assert(dest);
 assert(src);
 while(*src)/*把src的字符从前到后往dest里拷贝*/
 {
  *dest=*src;
  dest++;
  src++;
 }
 *dest=‘\0‘;/*拷贝上最后的‘\0‘,因为strcpy有将src里的‘\0‘拷贝到dest里的功能*/

{
 char str1[15];
 char str2[]="hello world";
 my_strcpy(str1, str2);
    printf("%s\n",str1);
return 0;
}

运行结果:

2:strcmp的实现

函数功能:字符串大小的比较,如果有str1,str2两个字符串则有两种结果,相等 ,str1大,str2大。

让str1的第一个元素和str2第一个元素相比较它们的ASCII值,若当比较到两个字符最后还没分出大小则返回0,如果没有比较到‘\0‘的位置就分出大小则也返回相应的值。如的str1当前元素大于str2的当前元素则返回整数,否则返回负数。

代码实现:

#include<stdio.h>//模拟实现strcmp
#include<assert.h>
int my_strcmp(const char *str1, const  char *str2)/*str1和str2都不需要改变*/
{
 assert(str1);
 assert(str2);
 while(*str1==*str2)
 {
  if(*str1==‘\0‘)/*可以表示此时的str1和str2比较到了最后,且都为‘\0‘*/
  {
   return 0;
  }
  str1++;/*如果str1和str2相等但是没到字符串末尾则让str1和str2往后移动,再次比较*/
  str2++;      
 }
    return *str1-*str2;/*如果两个不相等则用ASCII相减返回*/
}
int main()
{
 int ret=0;
 char str1[]="aac";
 char str2[]="abc";
 ret=my_strcmp(str1,str2);
 if(ret==0)
 {
  printf("str1和str2相等\n");
 }
 else if(ret>0)
 {
     printf("str1大于str2\n");
 }
 else if(ret<0)
 {
     printf("str1小于str2\n");

}
return 0;
}

运行结果:

3:改进上次strstr,strcat,strncat的实现(三个函数返回的均是地址。strcat和strncat是返回dest的地址,可以实现链式访问)

#include<stdio.h>//模拟实现strcat
#include<assert.h>
char  *my_strcat(char *dest, const char *src)
{
 char *address=dest;
 assert(dest);
 assert(src);
 while(*dest)
 {
  dest++;
 }
 while(*src)
 {
  *dest=*src;
  dest++;
  src++;
 }
 *dest=‘\0‘;
 return  address;
}
int main()
{
 char  str1[15]="hello";
 char  str2 [] ="world";
 printf("%s\n",my_strcat(str1, str2));
return 0;
}
*/

/*
#include<stdio.h>//模拟实现strncat
#include<assert.h>
char  *my_strncat(char *dest, const char *src)
{
 int n,i;
 char *address=dest;
 scanf("%d",&n);
 while(*dest)
 {
  dest++;
 }
 for(i=0;i<n;i++)
 {
  *(dest+i)=*(src+i);
 }
 *(dest+i+1)=‘\0‘;
 return address;
}
int main()
{
 char str1[15]="hello";
 char str2 [] ="world";
 printf("%s\n",my_strncat(str1, str2));
 return 0;
}
*/

/*
#include<stdio.h>//模拟实现strstr
#include<string.h>
char *my_strstr(char *str1,char *str2)
{
 int i,j;
 int len1=strlen(str1);
 int len2=strlen(str2);
 for(i=0;i<len1;i++)
 {
  for(j=0;j<len2;j++)
  {
   if(str1[i]==str2[j])
    return &str1[i];
  }
 }
 return NULL;
}
int main()
{
 char str1[]="he is good teacher";
 char str2[]="good";
 printf("%s\n",my_strstr(str1,str2));
return 0;
}
*/

4:strlen的实现

函数功能:strlen完成一个计数的功能,从后到前扫描字符串直到遇到‘\0‘停止,最后计数的结果不包括‘\0‘。

代码有三种实现方式,计数器法,地址运算法,递归函数法:

*/

#include<stdio.h>//模拟实现strlen  计数器法

#include<assert.h>

int my_strlen(const char *str)

{

int count=0;

assert(str);

while(*str)

{

count++;

str++;

}

return count;

}

int main()

{

int ret=0;

char str[]="abcdefg";

ret=my_strlen(str);

printf("%d\n",ret);

return 0;

}

#include<stdio.h>//模拟实现strlen   地址运算法

#include<assert.h>

int my_strlen(const char *str)

{

char *tmp=str;

assert(str);

while(*str)

{

str++;

}

return str-tmp;/*地址相减得到中间的元素的个数*/

}

int main()

{

char str[]="abcdefg";

printf("%d\n",my_strlen(str));

return 0;

}

#include <stdio.h>//模拟实现strlen    用递归方法

#include <assert.h.>

int my_strlen (const char *str)

{

assert(str);

if(*str==‘\0‘)

return (0);

else

{

return my_strlen(str+1)+1;

}

}

int main()

{

int ret=0;

char str[]="abcdefg";

ret=my_strlen(str);

printf("%d\n",ret);

return 0;

}

5:memcpy函数

内存拷贝函数,是将src所指内存地址的起始位置拷贝count个字节到目标dest

所指向内存处的空间,是从dest第一的位置开始覆盖,一共用src里的n个字节的信息覆盖。

函数原型:void  *memcpy(void *dest, const void *src,int count)

代码实现:

#include<stdio.h>//模拟实现momcpy
#include<assert.h>
void* my_momcpy(void *buf1,const void *buf2, int count )/*空类型的指针,所以buf1,buf2可以接收任何类型的数组*/
{
 char *ret=buf1;/*要*返回dest的地址,以便输出*/
 char *dest=(char*)buf1;/*将指针强制类型转化成字符型,以便于一个一个字节地拷贝*/
 char *src =(char*)buf2;
 assert(buf1);
 assert(buf2);
 while(count--)
 {
  *dest=*src;
  dest++;
  src++;
 }
 return ret;
}
int main()
{
 char str[]="hello world";
 char arr[10];
 
 printf("%s\n",my_momcpy(arr, str, 6));/*拷贝6个字节地信息到arr[10]里*/
 return 0;

}

memcpy和strcpy的区别:

strcpy只能对字符串进行操作,且内存里有0时strcpy有可能会误以为是‘\0‘,结束拷贝工作,这样就会造成拷贝操作的局限性;memcpy是内存拷贝函数,可以对任何类型的数组进行拷贝,它是将一个一个字节的信息从src拷贝到dest里,也可以跨类型进行拷贝。 (ASI标准不规定memcpy实现内存重叠拷贝,但有的编译器会实现此功能)

6:memmove函数

函数功能:将src所指向内存区域复制count个字节信息到dest里,可以实现内存不重叠的拷贝工作,也能实现内存重叠处的拷贝工作

函数原型:void *memmove( void *dest, const void *src,  Int count

代码实现:

#include<stdio.h>//模拟实现mommove
#include<assert.h>
void* my_mommove(void *buf1,const void *buf2 ,int count)/*空类型的指针接收数组名,以便于一次性将所有可能性的类型强制类型转换成char* */
{
 char *ret=buf1;
 char *dest=(char*)buf1;/*强制类型转换成char*,这样可以一个字节一个一个字节地将信息拷贝*/
 char *src =(char*)buf2;
 assert(buf1);
 assert(buf2);
 if((dest<(src+count))&&dest>src)/*内存重时叠*/
 {
  while(count--)
  {
   *(dest+count)=*(src+count);
  }
 }
 else/*内存不重叠时*/
 {
  while(count--)
  {
   *dest=*src;
   dest++;
   src++;
  } 
 }
 return ret;
}
int main()
{
 int arr[10]={1,2,3,4,5,6,7,8,9,0};
 int i;
 my_mommove(arr+5,arr+2,16);/*将3 4 5 6 拷贝到 6 7 8 9的位置,4个元素16个字节 */
 for(i=0;i<10;i++)
 {
  printf("%d  ",arr[i]);
 }
 return 0;
}
运行结果:

(本次实现了strcmp,strcpy,strlen,memcpy,memmove,另外改进了strstr,strcat,strncat)

时间: 2025-01-01 05:45:15

部分函数功能的实现的相关文章

sql server中部分函数功能详解

1.TOP 子句 TOP 子句用于规定要返回的记录的数目. 对于拥有数千条记录的大型表来说,TOP 子句是非常有用的. SQL Server 的语法: SELECT TOP number|percent column_name(s) FROM table_name 2.’%%’查询 我们希望从上面的 "Persons" 表中选取居住的城市以 "A" 或 "L" 或 "N" 开头的人: 我们可以使用下面的 SELECT 语句:

前端常见问题及引起原因(一)

JS部分: 1.引用公共模板页(该模板一般引用了其对应的JS文件)到某页面,部分函数功能不可用且控制台不报错. 查错方式:看其他引用该模板页的功能是否可用,如果其他页面可用,对比当前页面与模板页引用的js文件是否冲突:如果其他页面该功能依然不可用,则查看该功能函数是否有误. (引用JS冲突,常见的是多次JQuery库引起的冲突) 2.在同一个页面中,同样方式触发及生成的提示框,有的可以正常触发及显示,而有的只有重刷页面时才触发及显示,控制台不报错. 查错方式:看生成提示框所用的ID是否相同,若相

海量用户-高并发SAAS产品测试上线流程

海量用户高并发SAAS产品测试上线流程 SAAS产品测试上线流程-以Web插件产品为例子 1   概述 在互联网产品中,IT公司之间更加注重产品功能之间的协作,SAAS形态的产品扮演着越来越重要的作用. 一个典型的完全由宿主代理的SAAS服务的通讯流程如下图: 这样的产品一般具有如下特点: 一般由第三方提供专门的服务 通常以网络为媒介来提供服务 具备嵌入的客户端功能 具备第三方服务端功能 一般不以独立的产品形式直接面向客户 一般需要集成“寄生”在宿主产品中来面向客户 SAAS形态的主要产品有:

JS框架整理

1. Dojo (演示地址) Dojo是一个强大的面向对象JavaScript框架.主要由三大模块组成:Core.Dijit.DojoX.Core提供ajax,events,packaging,CSS-based querying,animations,JSON等相关操作API.Dijit是一个可更换皮肤,基于模板的WEB UI控件库.DojoX包括一些创新/新颖的代码和控件:DateGrid,charts,离线应用,跨浏览器矢量绘图等. 2. Jquery jquery是一个快速.简洁的Jav

TI OMAPL处理器介绍(二)

无意间收集到这篇有关OMAP技术介绍文章,感觉出作者的行文幽默,和深厚的技术功底,特分享给大家. 以SEED-DIM138/1808-Kit上的LED灯D1为例讲述如何进行相关开发(一) 本文档的使用许可证: 本文档遵循GPLv2发布,因此任何人引用或修改本文档均需要在发起引用的文章的显要位置(开头或结束处)原样引入本段文字(互联网及电子文档为斜体蓝色,)及所引用版本的下一段的文档编辑人员的列表及工作内容. 适用器件:操作适用于基于TI OMAP-Lx8 C6748 AM18xx处理器的SEED

Python各数据类型详细功能介绍

一.str 字符串 字符串属于不可变类型,对字符串对象的进行的任何功能性操都不会改变字符串本身. a.字符串常用功能: 1.lower 将所有大写变小写(功能不如casefold,仅支持英文) name = 'SMITH' v = name.lower() print(v) 2. upper 将所有小写变大写 name = 'smith' v = name.upper() print(v) 3. startswith 检查是否以指定值开头 name = 'smith' v = name.star

Python解释器的探讨:第一部分函数对象

Python解释器的探讨:第一部分函数对象 最近三个月,我和Ned Batchelder花费了大量时间在开发byterun.这个项目byterun(https://github.com/nedbat/byterun)是使用python开发的python字节码的解释器.开发解释器byterun过程中,让我学习到很多东西,以及带来很大的乐趣.在本文系列里,我将带你来体验一下我的开发乐趣,以及使用byterun是非常高兴的事情.不过,在体验快乐之前,先要理解一些基础的知识,就像做运动之前先来暖身一下:

采用c#实现功能1

看了好多c#的菜鸟教程不如自己开始动手打代码,最终实现了功能一,参考了网上的wordcount代码发现无论是c++还是c#大部分采用的是哈希表的方法实现的,本来还想仅用循环实现遍历句子中的所有字符,即发现"  "就total++,但是考虑到功能二的单词数变得很多,这样做时间相对来说会慢一点,因此选择了hash表来实现功能.因为仅是一个句子,所以只需要将句子中的空格split就可以了,但在解决过程中我碰到的最大问题是C:\Users\dell-pc\Desktop\wcc\wcc\Int

微信公众平台的最新功能详细介绍与使用技巧!

近日微信官方发布消息,微信公众平台的操作进行了又一次"感天动地"的更新 且听我一一道来 本次主要重要改(Geng)革(Xin)凸显在三个地方 改(Geng)革(Xin)一:图文模版的收藏与使用 这,真的是一个超级实用的功能呀,那么如何使用呢?在哪里找呢? 首先告诉大家,如何收藏图文模板 选中编辑区的部分或者全部素材,然后点击添加模版,图文模板即可收藏成功: 当然,你还可以从外部进行粘贴和复制内容到图文模版. 那么,在哪里找到我收藏的模版呢?? 嗯,就在添加图文模版的旁边啦! 同时,你还