zoukankan      html  css  js  c++  java
  • 以面试官的角度看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++) != '')       
        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++) != '' );        
        return tmp;     //为了实现链式操作,将目的地址返回。获得函数返回值;  
    }  


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

    //得2分       
    void strcpy( char *dest, char *src )       
    {       
        while( (*dest++ = * src++) != '' );       
    }        
        
    //得4分       
    void strcpy( char *dest, const char *src )        
    {       
        //将源字符串加const,表明其为输入參数。加2分       
        while( (*dest++ = * src++) != '' );       
    }        
        
    //得7分       
    void strcpy(char *dest, const char *src)        
    {       
        //对源地址和目的地址加非0断言,加3分       
        assert( (dest != NULL) && (src != NULL) );       
        while( (*dest++ = * src++) != '' );       
    }        
        
    //得9分       
    //为了实现链式操作,将目的地址返回,加2分!

    char * strcpy( char *dest, const char *src ) { assert( (dest != NULL) && (src != NULL) ); char *tmp = dest; while( (*dest++ = * src++) != '' ); 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++) != '' ); return tmp; }


     (4)assert的使用

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

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

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

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


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

    c. assert 与 if的差别:

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

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

    d 请看图片:


  • 相关阅读:
    swift网络数据请求方法
    使用jQuery在javascript中自定义事件
    javascript循环事件只响应最后一次的问题处理
    关于PHP 时区错误的问题
    安装MySql出现Error Nr.1045的解决办法
    view的阴影效果shadowColor
    关于Swift中的泛函数find的问题
    [BZOJ3196][Tyvj1730]二逼平衡树
    [BZOJ4671]异或图
    [BZOJ4621]Tc605
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/7220286.html
Copyright © 2011-2022 走看看