程序员面试常见面试题深入剖析


void test1()  
{  
 char string[10];  
 char* str1 = "0123456789";  
 strcpy( string, str1 );  
}  
     试题2:
[cpp] view plaincopy
void test2()  
{  
 char string[10], str1[10];  
 int i;  
 for(i=0; i<10; i++)  
 {  
  str1[i] = 'a';  
 }  
 strcpy( string, str1 );  
}  
        试题3:
[cpp] view plaincopy
void test3(char* str1)  
{  
 char string[10];  
 if( strlen( str1 ) <= 10 )  
 {  
  strcpy( string, str1 );  
 }  
}  

解答:

  试题1:字符串str1需要11个字节才能存放下(包括末尾的’\0’),而string只有10个字节的空间,strcpy会导致数组越界;

  试题2:如果面试者指出字符数组str1不能在数组内结束可以给3分;
                      如果面试者指出strcpy(string, str1)调用使得从str1内存起复制到string内存起所复制的字节数具有不确定性可以给7分,
                      在此基础上指出库函数strcpy工作方式的给10分;

  对试题3,if(strlen(str1) <= 10)应改为if(strlen(str1) < 10),因为strlen的结果未统计’\0’所占用的1个字节。

  剖析:

  考查对基本功的掌握:

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

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

      (3)库函数strcpy的工作方式,如果编写一个标准strcpy函数的总分值为10,下面给出几个不同得分的答案:
2分
[html] view plaincopy
void strcpy( char *strDest, char *strSrc )  
{  
  while( (*strDest++ = * strSrc++) != ‘\0’ );  
}  

4分
[html] view plaincopy
void strcpy( char *strDest, const char *strSrc )  
//将源字符串加const,表明其为输入参数,加2分  
{  
  while( (*strDest++ = * strSrc++) != ‘\0’ );  
}  

7分
[html] view plaincopy
void strcpy(char *strDest, const char *strSrc)  
{  
 //对源地址和目的地址加非0断言,加3分  
 assert( (strDest != NULL) && (strSrc != NULL) );  
 while( (*strDest++ = * strSrc++) != ‘\0’ );  
}  

10分
[cpp] view plaincopy
//为了实现链式操作,将目的地址返回,加3分!  
  
char * strcpy( char *strDest, const char *strSrc )  
{  
 assert( (strDest != NULL) && (strSrc != NULL) );  
 char *address = strDest;  
 while( (*address++ = * strSrc++) != ‘\0’ );          
  
   //原帖为while( (*strDest++ = * strSrc++) != ‘\0’ );  
  
  return address;  
}  



从2分到10分的几个答案我们可以清楚的看到,小小的strcpy竟然暗藏着这么多玄机,真不是盖的!需要多么扎实的基本功才能写一个完美的strcpy啊!

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

  读者看了不同分值的strcpy版本,应该也可以写出一个10分的strlen函数了,完美的版本为:

[html] view plaincopy
int strlen( const char *str ) //输入参数const  
  
{  
 assert( strt != NULL ); //断言字符串地址非0  
 int len = 0;  
 while( (*str++) != '\0' )  
 {  
  len++;  
 }  
 return len;  
}  






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值