1.找错

void test1()

{

char string[10];

char *str1="0123456789";

strcpy(string,str1);

}

试题一字符串str1需要11个字节才能存放下(包括末尾的‘/0'),而string 

只有10个字节的空间,strcpy会导致数组越界。

void test2()

{

char string[10],str1[10];

int i;

for (i=0;i<10;i++)

{

str1[i]='a';

}

strcpy(string,str1);

}

对试题2,如果面试者指出字符数组str1不能在数组内结束,指出strcpy

(string,str1)调用使得从str1内存起复制到string内存起所复制的字节数具有

不确定性,库函数strcpy工作方式

void test3(char *str1)

{

char string[10];

if (strlen (str1)<=10)

{

strcpy(string,str1);

}

}

if (strlen(str1<=10)

{

strcpy(string,str1);

}

}

对试题3,if(strlen(str1)<=10)应改为if (strlen (str1)<10),因为strlen的结果

未统计'/0'所占用的1个字节。

解析:

(1)字符串以’/0'结尾;

(2)对数组越界把握的敏感度

(3)库函数strcpy的工作方式,如果编写一个标准strcpy函数的总分值

void strcpy(char *strDest,char *strSrc)

{

while ((*strDest++=*strSrc++!='/0');

}

void strcpy(char *strDest,const char *strSrc)

//对源字符串加const,表明其为输入参数

{

while ((*strDest++=*strSrc++)!='/0');

}

void strcpy(char  *strDest,const char *  strSrc)

{

//对源地址和目的地址加非0断言

assert((strDest!=NULL)&&(strSrc!=NULL));

while ((*strDest++=*strSrc)!='/0');

}

//为了实现链式操作,将目的地址返回

char *strcpy(char *strDest,const char *strSrc)

{

assert((strDest!=NULL)&&(strSrc!=NULL));

char *address =strDest;

while ((*strDest++=*strSrc++)!='/0');

return address;

}

(4)对strlen的掌握,它没有包括字符串末尾的'/0'

int  strlen(const char *str)//输入参数const

{

assert(str!=NULL);//断言字符串地址非0

int len ;

while ((*str++)!='/0')

{

len++;

}

return len;

}

试题4:

void GetMemory(char *p)

{

p=(char*)malloc(100);

}

 

posted on 2018-02-07 12:15  HE不言  阅读(104)  评论(0编辑  收藏  举报