const定义常变量,其值不可修改
1.基本类型对const透明(const char a;),const只对a作用
2.const只修饰直接右边
3.权限只能同等传递或者缩小传递
assert,在debug模式下,代码出bug总是希望最早发现并进行改正嘛,但是测试函数时不一定能够测试全面,所以写代码时就加入判断条件,assert断言则是这个作用,例如函数中传入指针变量(注意需要引用头文件assert.h)
void MYstrcat(char *des,const char *src)
{
assert(src != NULL || des !=NULL);
}
若是空指针,则在此处报错。且assert仅在debug模式有效,release模式自动屏蔽,后续通常与if()连用,对非法值进行的操作。
--------------------------------------------------------------------------------------------------
字符串拷贝
void mystrcop(char *des,const char *src)
{
while(*des++ = *src++);
}
将src字符串拷贝在des中,这个代码中,while的判断是个赋值语句,赋值语句的判断就是只咬这个赋值后的结果为非零,就执行循环,这里将src的值赋值给des,只要src不是字符串结尾’\0’,则循环就执行,然后下次执行src++赋值给des++,一直执行。
字符串连接
void mystrcat(char *des , const char *src)
{
assert(des!=NULL || src!=NULL);
if(des==NULL || src==NULL)
{
return ;
}//参数检查
while(*des !='\0')//找到des的尾巴
{
des++;
}
while (*des++ = *src++);//将src拷贝到des后边
}
des和src进来,此时两变量都在起始处,将des找到他的尾部,然后将src赋值在des尾部,连接结束,参数检查就是assert的应用
求字符串有效长度(有效长度不包括字符串结尾标记)
int mystrlen(const char *des)
{
assert(des != NULL);
if(des == NULL)
{
return 0;
}//参数检查
int i;
for(i = 0;*des++ !='\0';++i)
{
}
return i;
}
用i进行计数,若不是字符串结尾,++i,des往后继续走
字符串比较
int mystrcmp(const char *des,const char *src)
{
assert(des != NULL || src != NULL);
if(des == NULL || src == NULL)
return 0;
while ((*des - *src)==0 && *des!='\0')
{
des++;
src++;
}
return (*des - *src);
}
比较两个字符串,若是相等,返回值为0;不相等,则返回差值,大于零,前字符串大,小于零,后字符串大。这里注意while循环中判断当前是否结尾很重要,不然当两字符串相等时程序出现bug,会死循环。
最后说一下字符串输出报错的问题
1.内存不足(数组长度不够):定义的字符串长度不够,导致操作时候字符串数组越界,所以崩溃
2.修改字符串常量