一、自己编写一个标准strcpy函数:
char*strcpy(char*str_dst,const char*str_org)
{
assert( (strDest != NULL) && (strSrc != NULL) );
char *address = strDest;
while( (*strDest++ = * strSrc++) != '/0' );
return address;
}
得分点:
//将源字符串加const,表明其为输入参数,加2分
//对源地址和目的地址加非0断言,加3分
//为了实现链式操作,将目的地址返回,加3分!
二、找错题
试题1:
void test1()
{
char string[10];
char* str1 = "0123456789";
strcpy( string, str1 );
}
字符串str1需要11个字节才能存放下(包括末尾的'/0'),而string只有10个字节的空间,strcpy会导致数组越界;
字符串str1需要11个字节才能存放下(包括末尾的'/0'),而string只有10个字节的空间,strcpy会导致数组越界;
试题2:
void test2(){
char string[10], str1[10];
int i;
for(i=0; i<10; i++)
{
str1 = 'a';
}
strcpy( string, str1 );
}
如果面试者指出字符数组str1不能在数组内结束可以给3分;如果面试者指出strcpy(string,
str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,在此基础上指出库函数strcpy工作方式的给10
分;
注:
C语言标准库函数
原型声明:extern char *strcpy(char *dest,const char *src);
头文件:
string.h
功能:把从src地址开始且含有NULL结束符的字符串赋值到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有
足
够的空间
来容纳src的字符串。
返回指向dest的指针。
试题3:
void test3(char* str1)
{
char string[10];
if( strlen( str1 ) <= 10 )
{
strcpy( string, str1 );
}
void test3(char* str1)
{
char string[10];
if( strlen( str1 ) <= 10 )
{
strcpy( string, str1 );
}
}
if(strlen(str1) <= 10)应改为if(strlen(str1) <
10),因为strlen的结果未统计'/0'所占用的1个字节。