C语言面试题,自己写库函数(memcpy、strcpy、strcmp....)

已知memcpy的函数为: void* memcpy(void *dst , const void* src , size_t count) 其中dst是目的指针,src是源指针。不调用c/c++的memcpy库函数,请编写memcpy。
/*
已知memcpy的函数为: void* memcpy(void *dst , const void* src , size_t count)
其中dst是目的指针,src是源指针。不调用c/c++的memcpy库函数,请编写memcpy。
2013-10-17
By Jackbase
*/
#include <stdio.h>
#include <string.h>
#include <assert.h>

void* memcpy(void *dst,const void *src,size_t count)
{
    //安全检查
    assert((dst!=NULL)&&(src!=NULL));
    
    unsigned char *pdst=(unsigned char *)dst;
    const unsigned char *psrc=(const unsigned char *)src;
    
    //防止内存重复
    assert(!(psrc<=pdst&&pdst<psrc+count));
    assert(!(pdst<=psrc&&psrc<pdst+count));
    
    while(count--)
    {
       *pdst=*psrc;
        pdst++;
        psrc++;
    }
    //memcpy是内存操作函数,非字符串操作函数
    /*
    *pdst='\0';  //字符串末尾加上'\0'
    */
    return dst;
}

void main()
{
    char* src="12345";
    char* dst=new char[];   //动态分配内存
    memcpy(dst,src,1);  
    printf("%s\n",dst); 
}

2013-10-17 20:34补充:介于网友的提问‘\0’不需要加入,不加的话其实有乱码出现。

2013-10-17 22:12 补充:*pdst='\0';确实应该去掉,因为memcpy是内存操作函数,我误解成了strcpy,是在惭愧啊,十分感谢hellosijian指正。

自己动手写C语言库函数strcpy和strlen

/*
自己动手写C语言库函数strcpy
2013-10-17
By Jackbase
*/

#include <stdio.h>
#include <string.h>
#include <assert.h>
size_t strlen(const char* src)
{
    assert(src!=NULL);
    int len=0;
    while((*src++)!='\0')
    {
        len++;
    }
    return len;
}
char* strcpy(char* dst, const char*src)
{
    //安全检查
    assert((dst!=NULL)&&(src!=NULL));
    
    char* pdst=dst;
    while((*dst++=*src++)!='\0');   
    return pdst;
}

void main()
{
    char *src="12345";
    char *dst=new char[];
    strcpy(dst,src);
    printf("%s\n%d\n",dst,strlen(dst));
}

写一个函数,实现两个字符串的比较。即实现strcmp函数,str_1=str_2时返回0,str_1!=str_2时返回二者第一个不同字符的ASCII值。

/*
写一个函数,实现两个字符串的比较。即实现strcmp函数,str_1=str_2时返回0,str_1!=str_2时返回二者第一个不同字符的ASCII值。 
2013-10-17
By Jackbase
*/
#include <stdio.h>
#include <string.h>
#include <assert.h>

int strcmp(char* src_1, char* src_2)
{
	int i=0;   //i为中间变量
   	//安全检查
	assert((src_1!=NULL)&&(src_2!=NULL));

	while((*(src_1+i)==*(src_2+i))&&*(src_1+i++));
	return (*(src_1+i)-*(src_2+i));
}
void main()
{
	char* a="add";
	char* b="ad";
	printf("%d\n",strcmp(a,b));
}


注:上述代码仅供参考。 

评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值