自己实现strcpy、strlen
strcpy的实现
思路:
通过指针访问地址然后将要copy的文本逐一复制到目的地。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
void my_strcpy( char * dest, char * src){ while (*src != '\0' ){ *dest = *src; src++; dest++; } *dest = *src; } //自己实现strcpy int main(){ char arr1[]= "$$$$$$$$$$" ; char arr2[]= "hello" ; my_strcpy(arr1,arr2); //将arr的内容复制到arr1中 printf ( "%s\n" ,arr2); return 0; } |
优化1:
在my_strcpy()函数中*dest和*src直接在表达式中自加,先试用后加所以使用后置++
1
2
3
4
5
6
|
void my_strcpy( char * dest, char * src){ while (*src != '\0' ){ *dest++ = *src++; } *dest = *src; } |
优化2:
在while循环中,因为最后的终止条件是赋值到了绝对0的时候停止循环。那么最后一次赋值就是赋值0。那我们直接可以将赋值作为我们的终止条件。
1
2
3
4
|
void my_strcpy( char * dest, char * src){ while (*dest++ = *src++); *dest = *src; } |
优化3:
如果传入的是空指针我们应该告诉这个输入有问题。
引入assert();断言–>如果输入错误显示错误。 个人理解就像java,python中的异常处理。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
#include <assert.h> void my_strcpy( char * dest, char * src){ assert (dest != NULL); assert (src != NULL); while (*dest++ = *src++); *dest = *src; } //自己实现strcpy int main(){ char arr1[]= "$$$$$$$$$$" ; char arr2[]= "hello" ; my_strcpy(arr1,NULL); //将arr的内容复制到arr1中 printf ( "%s\n" ,arr2); return 0; } |
优化4:
在程序员将dest 和 src写反的情况。我们应该怎么处理呢?
加const 使得我们的原来的数据不能被拷贝数据不能进行修改。从强制检测。另一方面解释:源头的数据的安全性得到保证。
1
2
3
4
5
6
7
|
#include <assert.h> void my_strcpy( char * dest, const char * src){ assert (dest != NULL); assert (src != NULL); while (*dest++ = *src++); //这里写反的话将不能进行赋值 因为c *dest = *src; } |
对于const的讲解
1
2
3
|
const int * p = # int * const p = # const int * const p = # |
在第一行中:即const 放在指针变量* 的左边的时候修饰的是*p 也就是说也就是说不能通过*p来改变*p(num )的值。
在第二行中:即const放在指针变量* 的右边的时候修饰的是指针本身p,p不能被改变。
在第三行中:两边都进行const修饰,p与*p都不能改变了。
我的理解:const只能修饰关键字本身右边的第一个东西(像int*就直接理解为指针)。const修饰的东西被限制。
优化5:
在官方提供的库函数中strcpy是有返回值的。返回什么呢?我们应该返回copy执行完成之后的字符串中首字母的地址。但是我们发现之前已经在执行的过程中就将dest值修改了。又怎么办呢?在刷算法题的时候有个经验就是,在对地址进行操作之前先提前备份一份。然后将备份的这个地址位置返回即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include <assert.h> char * my_strcpy( char * dest, const char * src){ char * res = dest; assert (dest != NULL); assert (src != NULL); while (*dest++ = *src++); *dest = *src; //将'\0'进行赋值。 return res; } #include <assert.h> char * my_strcpy( char * dest, const char * src){ char * res = dest; assert (dest != NULL); assert (src != NULL); while (*dest++ = *src++); *dest = *src; //将'\0'进行赋值。 return res; } |
总结:
1
2
3
4
5
|
1. 分析参数的设计(命名,类型),返回值的情况。 2. 关于野指针问题,空指针的危害。 3. assert的使用方式和作用 4. 参数部分使用const,以及const的作用。 5. 注释的重要性。 |
strlen的实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include <assert.h> int my_strlen( const char * str){ //不希望我的字符串被修改。 int count = 0; assert (str != NULL); //用来保证指针的有效性 while (*str != '\0' ){ count++; str++; } return count; } int main(){ char arr[] = "abcdef" ; int len = my_strlen(arr); printf ( "%d\n" ,len); return 0; } |
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注服务器之家的更多内容!
原文链接:https://blog.csdn.net/Tian_baby/article/details/122355246