strcpy函数的最优实现方法

微软自带的strcpy函数: (不完善,4分)

  1. char * strcpy(char * dest,const char *src)  
  2. {  
  3.     char *tmp = dest;  
  4.   
  5.     while ((*dest++ = *src++) != '\0')  
  6.           
  7.     return tmp;  
  8. }  

最完善的strcpy函数: (推荐使用,10分)

  1. char * strcpy( char *dest, const char *src )       //将源字符串加const,表明其为输入参数不能修改  
  2. {       
  3.     if(dest == src)     //考虑到源字符串和目的字符串有重叠,也即地址相同  
  4.     {   
  5.         return dest;   
  6.     }    
  7.   
  8.     assert( (dest != NULL) && (src != NULL) );        //对源地址和目的地址加非空地址断言  
  9.       
  10.     char *tmp = dest;          //备份目的字符串的首地址,由于后面的操作会修改dest值  
  11.       
  12.     while( (*dest++ = * src++) != '\0' );       
  13.       
  14.     return tmp;     //为了实现链式操作,将目的地址返回,获得函数返回值;  
  15.   
  16. }  

推荐的原因:(看得分点)

  1. //得2分       
  2. void strcpy( char *dest, char *src )       
  3. {       
  4.     while( (*dest++ = * src++) != '\0' );       
  5. }        
  6.     
  7. //得4分       
  8. void strcpy( char *dest, const char *src )        
  9. {       
  10.     //将源字符串加const,表明其为输入参数,加2分       
  11.     while( (*dest++ = * src++) != '\0' );       
  12. }        
  13.     
  14. //得7分       
  15. void strcpy(char *dest, const char *src)        
  16. {       
  17.     //对源地址和目的地址加非0断言,加3分       
  18.     assert( (dest != NULL) && (src != NULL) );       
  19.     while( (*dest++ = * src++) != '\0' );       
  20. }        
  21.     
  22. //得9分       
  23. //为了实现链式操作,将目的地址返回,加2分!       
  24. char * strcpy( char *dest, const char *src )        
  25. {       
  26.     assert( (dest != NULL) && (src != NULL) );       
  27.     char *tmp = dest;        
  28.     while( (*dest++ = * src++) != '\0' );        
  29.     return tmp;       
  30. }      
  31.     
  32. //得10分,基本上所有的情况,都考虑到了    
  33. //如果有考虑到源目所指区域有重叠的情况,加1分!       
  34. char * strcpy( char *dest, const char *src )        
  35. {       
  36.     if(dest == src) { return dest; }    
  37.     assert( (dest != NULL) && (src != NULL) );       
  38.     char *tmp = dest;        
  39.     while( (*dest++ = * src++) != '\0' );        
  40.     return tmp;       
  41. }    

两者比较说明 :

1)微软提供的字符串源码由于去掉了一些啰嗦的安全性检查,使其代码变的相当简单,提高了性能;
2)所推荐的程序,适用于我们经常做的Debug版本,涉及了一些安全性检查,提高程序的健壮性,这些都是程序员所需考虑的。

assert总结


assert"断言"的理解及使用:

a. 断言,也即做出一些假设,假设该表达式是正确的,若程序运行正确,该断言程序成立;若断言的表达式不成立,程序运行一定会出错,整个程序就会退出。多用于Debug调试,且能快速定位错误位置;

assert(表达式);

如果表达式的值为假,整个程序将退出,并输出一条错误信息。如果表达式的值为真则继续执行后面的语句。


b. assert是宏,而不是函数,使用这个宏需要添加头文件 #include <assert.h>


c. assert 与 if的区别:

if : 条件成立继续执行、条件不成立也继续执行。

assert:条件成立继续执行、 条件不成立停止执行 


简单例子测试,对除数为0进行断言演示


补充——strcpy函数使用易错点

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
在STM32上实现字符串复制功能需要使用strcpy函数strcpy是C语言中常用的字符串库函数之一,它用于将一个字符串的内容复制到另一个字符串变量中。 具体实现方法如下: 1. 首先,需要包含相应的头文件。在STM32中,可以使用#include <string.h>来包含该头文件,其中包含了strcpy函数的声明。 2. 然后,定义源字符串和目标字符串。源字符串即需要被复制的字符串,目标字符串即复制后的结果。可以使用char类型的数组来定义字符串变量。 3. 调用strcpy函数进行复制。strcpy函数的原型为char* strcpy (char* destination, const char* source),它接受两个参数,第一个参数是目标字符串,第二个参数是源字符串。该函数将源字符串的内容复制到目标字符串,并返回目标字符串的指针。 4. 复制完成后,可以通过打印目标字符串来验证复制结果。可以使用printf函数打印字符串,也可以使用串口调试工具来查看输出结果。 下面是一个简单的示例代码,演示了如何在STM32上使用strcpy函数实现字符串复制功能: #include <stdio.h> #include <string.h> int main() { char source_str[] = "Hello World"; // 源字符串 char target_str[20]; // 目标字符串 // 使用strcpy函数进行复制 strcpy(target_str, source_str); // 打印目标字符串 printf("Target string: %s\n", target_str); return 0; } 以上代码演示了strcpy函数的基本使用方法。在实际的项目中,可以根据具体需求进行相应的扩展和化,如增加错误处理、内存空间管理等。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值