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

摘自牛客网:

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参数)

推荐阅读更多精彩内容