C/C++题目--strcpy函数

题目:以下代码是否正确?


 
 
  1. char a[ 4],b[]={ "COPY"};
  2. strcpy(a,b);

参考答案

错误。因为把原字符串b赋值给字符串a时,b的长度包括了\0为结束符,算是一个字符,共5个字符,而a长度只为4。所以b长度大于a的长度时,不能把b拷贝到a数组当中,否则运行时就会崩溃。

题目:以下代码是否正确?


 
 
  1. char a[ 5];
  2. char *b=”copy”;
  3. strcpy(a,b);    

参考答案 

正确。

题目:以下代码是否正确? 


 
 
  1. char *a=”hello world”;
  2. char b[]={ "COPY"};
  3. strcpy(a,b);

参考答案

错误的。因为a作为指针指向的是字符串常量地址,而该常量是无法被修改的,因此复制给a指向的内容时,程序就会崩溃。

题目:如果我可以写

char a[]=”Hello, world”:

那为什么不能写

char a[14];

a=”Hello, world”;

参考答案

字符串是数组,而不能直接对数组赋值。可以使用strcpy()代替:

strcpy(a,”Hello, world!”);

strncpy问题

题目:strcpy与strncpy的区别?

参考答案

strcpy只是复制字符串,但不限制复制的数量,很容易造成缓冲一处。strncpy安全一些。

代码1 


 
 
  1. char *p= "are you ok";
  2.          char *name= "yes fine mi fans";
  3.          strcpy(name,p);
  4.          cout<<name<< endl;;
  5.          strncpy(name,p, sizeof(name));

代码2 


 
 
  1. char name[]= "helloworld",dest[ 20]={ 0};
  2.          strncpy(dest,name, 5); //只复制前5个字符,即hello

题目:请实现strcpy函数。

【参考答案】

答案1:(自己的思路和网上的答案差不多) 


 
 
  1. char * strcpy( char *strDest, const char *strSrc )
  2. {
  3.   //第1种.assert( (strDest != NULL) && (strSrc != NULL) );
  4.   if(strDest== NULL ||strSrc == NULL ) //第2种
  5.            throw "非法操作";
  6.   char *address = strDest;
  7.   while((*strDest++=*strSrc++) != '\0');
  8.   return address;
  9. }
  10. int main()
  11. {
  12. char a[ 10],b[]= "hello";
  13. strcpy(a,b);
  14. cout<<a<< endl
  15. return 0;
  16. }

答案2:(来自《经典C面试真题精讲》)

对于复制字符串问题而考虑的因素如下(优解函数,以下是原文的部分内容):

(1)对输入参数的合法性检测:如果参数dest或src指针有一个是空指针(指针等于NULL),那么就无法完成字符串复制的工作,所以应该提前退出,不应该继续执行。

 

 
 


(2)内存区域重叠:虽然内存重叠这种现象在系统内存日趋海量的情况下出现的机率很小,但并不能保证就不会出现,而这种情况的出现,对系统或产品带来的问题是严重的,并且难以快速定位。笔者在多年实际项目开发中就遇到过类似问题,为此问题也付出过惨重代价。对于该题目,内存区域的划分无非就是图1-5、图1-6、图1-7中所列出的3种类型,当内存区域为图1-5或图1-6时,对于字符串从src区域复制到dest区域是完全可以通过上述代码实现的。但如果内存区域是图1-7的情况时,如果按照上述代码实现,那么肯定会出现内存重叠,也就是说当复制到一定程度时,之前复制过的字符串会被后面复制的字符串覆盖。对于图1-7这种情况,我们就必须采取其他办法来实现字符串的正确复制。细心的读者也许已经想到,我们可以从src指向字符串的最后一个字符开始复制,即从后往前进行复制,这样就不会出现之前复制的字符在后面复制中被覆盖的情况。注意:这种情况下src指向的字符串部分或全部内容被覆盖。

 


 
 
  1. #include<assert.h>
  2. char *mystrcpy(char *dest,char *src)
  3. {
  4. char *d=dest;
  5. char *s=src;
  6. int count= 0;
  7. assert(dest);
  8. assert(src);
  9. if(src==dest)
  10.     return src;
  11. count= strlen(src)+ 1;
  12. if(count<= 1)
  13.     return 0;
  14. if(dest<src||dest>=(src+count))
  15.   {
  16. while(count--)
  17. *d++=*s++;
  18.   }
  19. else
  20. {
  21.         d=dest+count;
  22.          s=src+count;
  23.          while(count--)
  24.   {
  25.          *d--=*s--;
  26.          }
  27. }
  28. return dest;
  29. }
  30. int main()
  31. {
  32.      char a[ 20];
  33.      char *b= "hello";
  34.      mystrcpy(a,b);
  35.      cout<<a<< endl;
  36.       return 0;
  37. }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值