文章目录
前情提要
断言(assert(expression))
断言是一种除错机制,用于验证代码是否符合编码人员的预期。编码人员在开发期间应该对函数的参数、代码中间执行结果合理地使用断言机制,确保程序的缺陷尽量在测试阶段被发现。
也就是说,断言assert函数只能在测试阶段用,不能在release版本使用。
- 其原型定义在 <assert.h> 文件中
- assert 将通过检查表达式 expression 的值来决定是否需要终止执行程序。也就是说,如果表达式 expression 的值为假(即为 0),那么它将首先向标准
错误流
stderr 打印一条出错信息,然后再通过调用 abort 函数终止程序运行;否则,assert 无任何作用。
const修饰指针的两种情况
const放在*的左边
- 限制的是指针指向的内容,也就是说:不能通过指针来修改指针指向的的内容
- 但指针变量是可以修改的,也就是指针可以指向其他变量
const放在*的右边
- 限制的是指针变量本身,指针变量不能再指向其他对象
- 但可以通过指针变量来修改指向的内容
strlen
函数原型
函数实现
递归
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
assert(str);
if (*str)
{
return 1 + my_strlen(str + 1);
}
}
int main()
{
char str[] = "abcdef";
printf("%zd", my_strlen(str));
return 0;
}
指针相减法
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
assert(str);//断言:如果括号内为假则结束程序并提示。
const char* end = str;
while (*end++)
;
return end-str-1;//指针-指针是元素个数
}
int main()
{
char str[] = "abcdef";
printf("%zd", my_strlen(str));
return 0;
}
数组下标法
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
assert(str);
int i = 0;
while (str[i++])
;
return i-1;
}
int main()
{
char str[] = "abcdef";
printf("%zd", my_strlen(str));
return 0;
}
定义变量计数
#include<stdio.h>
#include<assert.h>
size_t my_strlen(const char* str)
{
assert(str);
int count = 0;
while (*str++)
{
count++;
}
return count;
}
int main()
{
char str[] = "abcdef";
printf("%zd", my_strlen(str));
return 0;
}
sizeof(多算一个’\0’,注意减1)
#include<stdio.h>
int main()
{
char str[] = "abcdef";
printf("%zd",sizeof(str)/sizeof(str[0])-1);
return 0;
}
strcpy
函数原型
函数实现
普通版
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char*dest, const char* src)
{
char* start = dest;
assert(dest);
assert(src);
while (*src)
{
*dest++ = *src++;
}
*dest = *src;//'\0'
return start;
}
int main()
{
char str1[20] = "0";//一定要足够大
char str2[] = "abcdef";//结尾一定要有'\0
printf("%s", my_strcpy(str1, str2));
return 0;
}
加强版
#include<stdio.h>
#include<assert.h>
char* my_strcpy(char*dest, const char* src)
{
char* start = dest;
assert(dest);
assert(src);
while (*dest++ = *src++)
;
return start;
}
int main()
{
char str1[20] = "0";//一定要足够大
char str2[] = "abcdef";//结尾一定要有'\0
printf("%s", my_strcpy(str1, str2));
return 0;
}