【面试题】写出完整版的strcpy函数
2017-07-25 本文已影响396人
wshxj123
摘自牛客网:
char * strcpy( char *strDest, const char *strSrc ) //加入const表明是输入参数
{
assert( (strDest != NULL) && (strSrc != NULL) ); //断言,判断是否为空
char *address = strDest;
while( (*strDest++ = * strSrc++) != ‘\0’ );
*address='\0';
return address; //返回了目的地址,可实现链式操作
}
- 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常量完全取代宏常量。
-
断言
assert的作用是现计算表达式 expression ,如果其值为假(即为0),那么它先向stderr打印一条出错信息,然后通过调用 abort 来终止程序运行。 -
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参数)