编写字符串复制函数

编写字符串复制函数

字符串复制函数看似简单,但隐藏了一些容易被忽略的细节,这些细节恰恰也是平时工作中的隐藏的BUG所在,一旦发生很难察觉,而且这也是各大企业在招聘的时候重要的考点。下面说明一下。

问题:设计一个字符串复制函数如下

char *str_copy(char *dest, const char *src)

要求:把src所指向的字符串中的内容复制到dest所指向的字符数组(或字符指针)中。(注意:src和dest所指向的内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串(笔者当初将dest设为字符指针时候差点忘了这个问题),返回指向dest的指针)

 

解答:

 

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

char *str_copy(char *dest, const char *src)
{
     assert((dest!=NULL)&&(src!=NULL));//(1)这句一定得有,断言。关于这个介绍,在后面说明。
     char *pd=dest;
     while((*dest++=*src++)!='\0'); //(2)

 

     return pd;
}

int main()
{

    char dest[20];
    //char *dest=(char*)malloc(sizeof(char)*20); //或者用char dest[20];
    //char dest[]="good morning";这一句也可以,但必须这个字符串长度要大于等于src[]中的字符串 长度,
 //不然发生数组越界。但是如果用char *dest="good morning";之后再执行str_copy就错了,因为这么声明
 //的dest是个字符串常量,这个地址dest是个指向const的指针,指针指向的内容不可以变,所以如果给它从新
 //赋值,会造成程序崩溃。搞清楚char dest[]="good morinig";和char *dest="good morning";的区别和联系
    char *p=dest;
    char src[]="Hello eric!"; //或者是char *src="Hello eric!";
    //char *src=NULL; //测试用例,如果src或者dest有一个是NULL,assert断言发生作用。
    str_copy(dest, src); //或者是str_copy(dest, "Hello eric!");
    //while(*p!='\0')
    //{
        //printf("%c",*p++);
    //}
    printf(dest); //或者printf("%s\n",dest);
    system("pause");
    return 0;
}


 

说明:(1)程序一般分为Debug 版本和Release 版本,Debug 版本用于内部调试,Release 版本发行给用户使用。

assert(表达式)的意思是:当表达式为真时,程序继续运行,如果表达市为假,那程序就会停止运行,并提示错误信息。
注意:assert是一个宏,只在debug版本中起作用,在release版本中,该语句是不起任何作用的。

如果将src或者dest设为NULL(程序中的注释中有说明),则assert(断言)发生作用,截图如下。

(2)这句话实际上已经包含了将src中的'\0'拷贝到dest中。如果不是直接在括号里一步实现,不要忘了在拷贝完成之后,单独给dest加'\0'

while(*src!='\0')

{
  *dest++=*src++;
}
*dest='\0';

 


 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值