1 //
2 // Strcpy.c
3 // libin
4 //
5 // Created by 李宾 on 15/8/20.
6 // Copyright (c) 2015年 李宾. All rights reserved.
7 //
8
9 #include <stdio.h>
10 #include <assert.h>
11 #include <string.h>
12 /***********************************************不考虑覆盖*****************************************/
13 char * Strcpy1(char *dst, const char *src)//const 在*号左边,指的是指针所指向的内容为常量,不允许修改。
14 {
15 assert(dst != NULL && src != NULL); //判断指针是否为空,条件为假,中断程序。
16
17 char *ret = dst;
18
19 while((*dst++ = *src++)!='\0');
20
21 return ret; //返回dst是为了支持链式表达式。例如:int l=strlen(strcpy(strA,strB));
22 }
23
24
25
26 /**********************************************考虑内存重叠******************************************/
27 char *my_memcpy(char *dst, const char* src, int len)
28 {
29 char * ret = dst;
30 int n = len + 1;
31 if (dst>=src && dst <= src+len)
32 {
33 dst = dst + len;
34 src = src + len;
35 while (n --)
36 {
37 *dst-- = *src--;
38 }
39 }
40 else
41 while (n--)
42 {
43 *dst++ = *src++;
44 }
45 return ret;
46
47 }
48
49 char * Strcpy2(char *dst, const char *src)
50 {
51 assert(dst!= NULL && src != NULL);
52
53 char *ret = dst;
54
55 my_memcpy(dst, src, (int)strlen(src));
56
57 return ret;
58 }
59
60
61
62 int main()
63 {
64 //char *a = "hello"; //含义是先新建一个字符串,内容是abcd 然后str1是一个头指针,指向这个串.
65 char a[6] = {'a','b','c','d','e'}; //但是这个新建串是作为const存在的,并不是一个可以编辑的变量
66 char b[6] = {'l','o','v','e','i'}; //因此,一旦你想更改其中的值,程序就会挂掉.
67 char *c;
68 //a = Strcpy1(a,b); 数组名是指针常量,不能赋值。
69 c = Strcpy1(a, b);
70 puts(c);
71
72 }