以面试官的角度看strcpy函数

一:笔试或者面试的总结 之 一

(1)在笔试或者面试中经常会被问道,strcpy  memmove memcpy 函数的实现;有时也会问你STL 中string的 split 和 trim的实现;有的把函数声明部分给你,让你实现它;有的直接给你一个函数名称,自己看着写去吧。

二:下面以面试官的角度一一解读

(2)微软自带的strcpy函数: (不完善,4分)

char * strcpy(char * dest,const char *src)  
{  
    char *tmp = dest;  
    while ((*dest++ = *src++) != '\0')       
    return tmp;  
}  

(3)最完善的strcpy函数: (推荐使用,10分)
char * strcpy( char *dest, const char *src )       //将源字符串加const,表明其为输入参数不能修改  
{       
    if(dest == src)     //考虑到源字符串和目的字符串有重叠,也即地址相同  
    {   
        return dest;   
    }    
    assert( (dest != NULL) && (src != NULL) );        //对源地址和目的地址加非空地址断言     
    char *tmp = dest;          //备份目的字符串的首地址,由于后面的操作会修改dest值    
    while( (*dest++ = * src++) != '\0' );        
    return tmp;     //为了实现链式操作,将目的地址返回,获得函数返回值;  
}  


推荐的原因:(看得分点)

//得2分       
void strcpy( char *dest, char *src )       
{       
    while( (*dest++ = * src++) != '\0' );       
}        
    
//得4分       
void strcpy( char *dest, const char *src )        
{       
    //将源字符串加const,表明其为输入参数,加2分       
    while( (*dest++ = * src++) != '\0' );       
}        
    
//得7分       
void strcpy(char *dest, const char *src)        
{       
    //对源地址和目的地址加非0断言,加3分       
    assert( (dest != NULL) && (src != NULL) );       
    while( (*dest++ = * src++) != '\0' );       
}        
    
//得9分       
//为了实现链式操作,将目的地址返回,加2分!       
char * strcpy( char *dest, const char *src )        
{       
    assert( (dest != NULL) && (src != NULL) );       
    char *tmp = dest;        
    while( (*dest++ = * src++) != '\0' );        
    return tmp;       
}      
    
//得10分,基本上所有的情况,都考虑到了    
//如果有考虑到源目所指区域有重叠的情况,加1分!       
char * strcpy( char *dest, const char *src )        
{       
    if(dest == src) { return dest; }    
    assert( (dest != NULL) && (src != NULL) );       
    char *tmp = dest;        
    while( (*dest++ = * src++) != '\0' );        
    return tmp;       
}   

 (4)assert的使用

(听师兄们说)assert 在前几年的笔试和面试中,还是会被经常问道的,可是最近几年不显示的问了,总是暗含在某一到题目当中。例如上面的题型,搜狗面过,百度面过……

assert"断言"的理解及使用:

a. 断言,也即做出一些假设,假设该表达式是正确的,若程序运行正确,该断言程序成立;若断言的表达式不成立,程序运行一定会出错,整个程序就会退出。多用于

Debug调试,且能快速定位错误位置;assert(表达式);如果表达式的值为假,整个程序将退出,并输出一条错误信息。如果表达式的值为真则继续执行后面的语句。


b. assert是宏,而不是函数,使用这个宏需要添加头文件 #include <assert.h> 或 c++中添加#include<cassert>

c. assert 与 if的区别:

if : 条件成立继续执行、条件不成立也继续执行。

assert:条件成立继续执行、 条件不成立停止执行 。

d 请看图片:


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值