透过strcpy()看问题

转载请注明原文来自:http://blog.csdn.net/lizhiliang06/article/details/8649336

小明最近写程序发现经常会出现一些莫名其妙的错误,

就过来问大明,说程序总是出现问题的,而且莫名其妙的就挂在了strcpy这里了,

郁闷了挺久的了,于是刚毕业不久的小明还是不太好意思的来问了大明,

大明看了小明的代码,发现了一些问题,这些问题是平时写程序不太注意时经常发生的哦,

现在就展开来让大家一起看看大笑


[cpp]  view plain copy
  1. #include <stdio.h>  
  2. /* 
  3.  * 注意所犯错误1 
  4.  */  
  5. void error1()  
  6. {  
  7.     char str0[10];  
  8.     char *str1 = "0123456789";   
  9.     strcpy(str0, *str1);  
  10. }  
  11.   
  12. /* 
  13.  *注意所犯错误2 
  14.  */  
  15. void error2()  
  16. {  
  17.     char str0[10];  
  18.     char str1[10];  
  19.     int i = 0;  
  20.   
  21.     for(i=0; i<10; i++)  
  22.     {  
  23.         str1[i] = 'a';    
  24.     }  
  25.   
  26.     strcpy(str0, str1);  
  27. }  
  28.   
  29. /* 
  30.  *注意所犯错误3 
  31.  */  
  32. void error3(char *str1)  
  33. {  
  34.     char str0[10];  
  35.     int len = strlen(str1);  
  36.     if(len <= 10)  
  37.         strcpy(str0, str1);  
  38. }  
  39.   
  40. void main()  
  41. {  
  42.     error1();  
  43.     error2();  
  44.     error3("001123456789");/*注意*/  
  45.   
  46. }  

下面是对以上所犯错误做修正:

[cpp]  view plain copy
  1. /* 
  2.  * 注意所犯错误1修正 
  3.  */  
  4. void right1()  
  5. {  
  6.     char str0[11] = {0};  
  7.     char *str1 = "0123456789";   
  8.     strcpy(str0, str1);  
  9. }  
  10.   
  11. /* 
  12.  *注意所犯错误2修正 
  13.  */  
  14. void right2()  
  15. {  
  16.     char str0[11] = {0};  
  17.     char str1[11] = {0};  
  18.     int i = 0;  
  19.   
  20.     for(i=0; i<10; i++)  
  21.     {  
  22.         str1[i] = 'a';    
  23.     }  
  24.   
  25.     strcpy(str0, str1);  
  26. }  
  27.   
  28. /* 
  29.  *注意所犯错误3修正 
  30.  */  
  31. void right3(char *str1)  
  32. {  
  33.     char str0[10] = {0};  
  34.     int len = strlen(str1);  
  35.     if(len < 10)  
  36.         strcpy(str0, str1);  
  37. }  
  38.   
  39. void main()  
  40. {  
  41.     right1();  
  42.     right2();  
  43.     right3("001123456789");/*注意*/  
  44.   
  45. }  

请写出strcpy()原型设计代码:

比较常见的犯错应该像下面代码了,

[cpp]  view plain copy
  1. /*请写出strcpy()函数原型*/  
  2. /* 
  3. *注意1 
  4. */  
  5. void strcpy(char *dest, char *source)  
  6. {  
  7.     while(*source != '\0')  
  8.          *dest++ = *source++;  
  9. }  
  10.   
  11. /* 
  12.  * 注意2 加上const,防止参数被改变 
  13.  */  
  14. void strcpy(char *dest, const char *source)  
  15. {  
  16.     while(*source != '\0')  
  17.          *dest++ = *source++;  
  18. }  
  19.   
  20. /* 
  21.  * 好的strcpy应该如下 
  22.  */  
  23. void strcpy(char *dest, const char *source)  
  24. {  
  25.     assert((dest != NULL) && (source != NULL));  
  26.   
  27.     const char *temp_src = source;  
  28.     char *temp_dest = dest;//防止过程中改变dest的地址  
  29.   
  30.     while(*temp_src != '\0')  
  31.          *temp_dest++ = *temp_src++;  
  32. }  

转载请注明原文来自:http://blog.csdn.net/lizhiliang06/article/details/8649336
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值