美文网首页
【面试题】写出完整版的strcpy函数

【面试题】写出完整版的strcpy函数

作者: wshxj123 | 来源:发表于2017-07-25 15:39 被阅读396次

    摘自牛客网:

    char * strcpy( char *strDest, const char *strSrc )  //加入const表明是输入参数
    {
        assert( (strDest != NULL) && (strSrc != NULL) ); //断言,判断是否为空
        char *address = strDest; 
        while( (*strDest++ = * strSrc++) != ‘\0’ ); 
        *address='\0';
        return address; //返回了目的地址,可实现链式操作
    }
    

    1. const
    • 关于const修饰指针的情况,分为四种:(摘抄自《程序员面试宝典》49页)

      • const int a = &b*
      • int const a = &b
        如果const位于星号的
        侧,则const就是用来修饰指针所指向的变量,即指针指向为常量;
        如果const位于星号的
        侧,则const就是修饰指针本身,即指针本身是常量。
        所以1、2种情况,都是对内容
        a不能进行修改。可先不初始化。
      • int const a = &b*
        指针本身是常量,不能对指针本身进行更改操作,而指针所指向的内容不是常量。所以定义必须初始化。
      • const int const a = &b*
        指针本身和指向的内容均为常量。
    • const成员函数
      不改变类的数据成员,加上const提高程序可读性和可靠性。

    class Point {
     …
    public:
            int GetY() const;
    …
    }
    int Point::GetY() const { //函数末尾加const
            return yVal;
    }
    
    - const放在函数声明前,则表示返回值是常量。
    
    • const与#define相比有什么不同?
      C++语言可以用const定义常量,也可以用#define定义常量,但是前者比后者有更多优点。
      const常量有数据类型,而宏常量没有数据类型。编译器可以对前者进行类型安全检查,而对后者只进行字符替换,没有类型安全检查,并且在字符替换中可能会产生意料不到的错误。
      有些集成化的调试工具可以对const常量进行调试,但是不能对宏常量进行调试。在C++程序中只使用const常量而不使用宏常量,即const常量完全取代宏常量。
    1. 断言
      assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。

    2. memcpy

    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++;      
        }      
        return dst;      
    }    
    
    • memcpy和strcpy区别:
      摘自:http://blog.csdn.net/vgxpm/article/details/47614901
      a、strcpy只能应用字符类型的复制,而memcpy应用范围更广,任何类型都可以;
      b、memcpy相比使用strcpy会更加的安全,当然也可以使用strcpy的安全版本strncpy函数;(多了count参数指定拷贝字节大小)
      c、strcpy一定会拷贝字符串结尾符'\0',memcpy在拷贝字符串的时候,根据指定拷贝字节数拷贝字符串,是否拷贝‘\0’结束符,根据count的大小;
      d、在拷贝相同的字符串,且字节数相同(包括‘/0’)的情况下,strcpy效率比memcpy效率更快。(strcpy需要控制两个变量,但是memcpy多一个count参数)

    相关文章

      网友评论

          本文标题:【面试题】写出完整版的strcpy函数

          本文链接:https://www.haomeiwen.com/subject/gnywkxtx.html