c语言提供了各种各样的标准库函数,使用时只需#include预处理指令调用这些库函数功能。
那么这些库函数到底是如何实现功能并适用几乎任何情况呢?
1.实现strcpy函数。
strcpy函数可以实现将字符串拷贝到目标数组中的功能。
strcpy(destination,source)
既然它是函数,想要进行操作就得传参然后通过指针得方式来实现,那么在source位置就需要给一个char * source得指针变量来接收字符串(其中字符串常量赋值给指针变量时传递的是字符串首元素的地址),然后通过功能将元素一个一个赋值给destination处定义的指针变量 char* dest(用来接受数组的首地址),最后将最后一个‘\0’赋值后结束.
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<windows.h>
#include<assert.h>
char* my_strcpy(char*dest,const char*soc)
{
//先将各个元素进行赋值,直到前者被赋予\0.那么个根据while语句性质()内如果为o即停止
char*a = dest;//防止返回值被破坏
if (dest == soc)
{
return dest;
}
assert((soc!= NULL) || (dest != NULL));//使用断言宏来进行异常提示
while ((*dest++ = *soc++)!='\0');//此处为赋值而不是判断大小
return a;
}
int main()
{
char arr[10] = { 0 };//数组在创建时若未大小会提示越界error
my_strcpy(arr, "asdasd");
printf("%s", arr);
system("pause");
return 0;
}
解析:1.将my_strcpy函数得返回值类型设定为char*类型目的是为了实现链式访问。
2.一个合格的程序需要有良好的健壮性和鲁棒性,以应对每次调用的问题和反馈,所以在if语句中先将dest和soc进行比较,如果地址相同,则直接返回目标。
3.assert是一种define定义的宏——断言。其存在于assert.h头文件中,当()内条件为假时候反馈异常信息并提示错误。即如果在main函数中定义了一个空指针并把它传递给了函数,那么就会直接报错。
4.运用单目操作符使得程序言简意赅,while()内0则为假,则通过赋值表达式的'\0'来判断
5.返回dest的值即地址,实现链式访问。
6.const char*soc意为soc使指向字符常量的指针,即可以改变p但是不能改变*p(这里仅指*p不能改变,如果这个内容通过其他方式改变了值,依然可行)若果p指向的内容,防止功能紊乱。(若const位于*后,那么则表示不能修改p所指向的地址,但是可以改变它所指向的值即*p
2.strlin函数的实现的三种方法
1.借助记数法
int my_strlin(const char*destsor)
{
assert(NULL != destsor);
int count = 0;
while ('\0' != *destsor++)
{
count++;
}
return count;
}
2.不借助任何变量
int my_strlin(const char*destsor)
{
assert(NULL != destsor);
if ('\0' == *destsor)
{
return 0;
}
return(1 + my_strlin(++destsor));//函数每次调用其本身,使+1的办法累计字符的个数,直到遇到\0结束。
}
这个方法使用了函数递归,通过+1将每次非\0得结果累计
3.不借助变量不使用if while等语句(极简版)
int my_strlin(const char*destsor)
{
assert(NULL != destsor);
return *destsor?(1 + my_strlin(++destsor)):0;//使用三目操作符
}
int main()
{
char arr[] = "asdasd";
int ss = my_strlin(arr);
printf("%d", ss);
system("pause");
return 0;
}
三目操作符原理,零是假,任何非零值为真,所以直接将*destsor置于左侧