1. 常见的coding技巧
1. 使用assert
2. 尽量使用const
3. 养成良好的编程风格
4. 添加必要的注释
5.避免编码陷阱
2. 实例模拟实现strcpy
模拟实现库函数strcpy的主要功能是将一个数组的字符串复制到另外一个数组中。实现起来也很容易将终点数组解引用后,让其与源头数组的地址解引用后相等直到遇到字符串的结束标志‘\0‘停止即可。具体代码如下
void my_strcpy(char* des, char* src)
{
while (*src != '\0')
{
*des = *src;
des++;
src++;
}
*des = *src; // 复制'\0'
}
int main()
{
char arr1[] = "HELLO,WORLD";
char arr2[15] = "xxxxxxx";
my_strcpy(arr2, arr1);
printf("%s", arr2);
return 0;
}
这里我们可以和库函数中定义的strcpy进行一下对比
这里我们看到库函数中定义的strcpy的返回类型是 char* 且源头数组为const char*,这就与我们模拟实现的strcpy有了区别,证明我们写的代码确实还是有改进的空间。就像上文提到的我们要编写优秀的代码就尽量能够善用assert 与 const 来进行修饰变量,并且这次我们要将复制过字符串的终点数组的地址返回。具体如下所示。
#include<stdio.h>
#include<string.h>
#include<assert.h>
char* my_strcpy(char* des, const char* src)
{
assert(des != NULL);
assert(src != NULL);
char* temp = des;
/*while (*des = *src)
{
des++;
src++;
}*/
while (*des++ = *src++)
;
return temp;
}
int main()
{
char arr1[] = "HELLO,WORLD";
char arr2[15] = "xxxxxxx";
char* p = NULL;
printf("%s", my_strcpy(arr2, arr1));
return 0;
}
2.1 assert的作用
这里的assert的用处就是防止my_strcpy函数接受到空指针,如果接收到空指针,编译器会直接报错。
像是这样,能够很好的提示我们那里出了问题。
并且记得使用assert前要引头文件哦
#include<assert.h>
2.2 const的用法
const修饰指针的时候
1. const 放在*的左边的时候限制的是指针所指向的内容,不能够通过指针变量来改变指针所指向的内容,但是指针本身是可以更改的。如下图
我们用const放在了*的左边之后 若再想通过地址去改变p指向的内容编译器会及时报出警告。若将p的地址改为arr1的地址是可以修改的。
2. const放在*的右边时,限制的是指针变量本身不能进行修改,但是指针变量指向的内容可以通过指针变量来进行修改,如下图所示。
通过这两个小例子,我们就能够理解为什么模拟strcpy时的源头数组要用const 来限制char *了,因为我们不希望将源头数组内容复制给终点数组的同时去改变源头数组中本身的内容。
最后我们再用一个实例来练习我们上述所描述的内容
3. 练习模拟实现strlen
具体代码如下所示
unsigned int my_strlen(const char* arr1)
{
assert(arr1!=NULL);
int count = 0;
while (*arr1++)
{
count++;
}
return count;
}
int main()
{
char arr1[] = "abcdefg";
unsigned int len = my_strlen(arr1);
printf("%d", len);
return 0;
}
4. 结束语
良好的习惯需要持续不断地练习,希望我们大家都能够培养出良好的写代码的习惯,我们大家一起共勉。