编写字符串复制函数

来源:互联网 发布:神奇表盘 网络错误 编辑:程序博客网 时间:2024/06/05 05:03

编写字符串复制函数

字符串复制函数看似简单,但隐藏了一些容易被忽略的细节,这些细节恰恰也是平时工作中的隐藏的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';

 


 

原创粉丝点击