马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 无符号整形 于 2018-8-3 20:44 编辑
strlen、strcpy、strcmp
PS:要想重写一个C标准库函数,关键是要明白它的原型和返回值。
1.strlen
PS:最简单的库函数,哈哈~
首先打开string.h来看strlen的原型:exturn size_t strlen(const char * _Str);
我们想一下如何实现?很多朋友会想:size_t strlen(const char * _Str)
{
const char * _Beg;
while (*_Str != '\0')
{
*_Str++;
}
return _Str - _Beg - 1;
}
其实可以更简单:size_t strlen(const char * _Str)
{
const char * _Beg = _Str;
while (*_Str++);//当_Str指向'\0'的时候因为'\0'的ascii码=0,所以自动跳出循环。
return _Str - _Beg - 1;
}
好了,strlen就实现了。(仅仅3行代码啊! )
2.strcpy
原型:extern char* strcpy(char* dest, char* src);
大家能不能用上面的方法继续做呢?
相信对于各位鱼油来说是很简单的:char* strcpy(char *dest, char *src)
{
while ((*dest++ = *src++) != 0);
return dest;
}
天哪!没想到这个两行代码搞定。。
3.strcmpexturn int strcmp(const char *dest, const char *source);
不过这个返回值有学问(摘自百度百科)
若str1==str2,则返回零;
若str1<str2,则返回负数;
若str1>str2,则返回正数。
然后经过我的测试,发现负数指-1,整数指1。
那么怎么做呢?相信聪明的你一定能想出来:int mystrcmp(const char *dest, const char *source)
{
while (*dest++ && *source++)
if (!*dest && *source)//每次循环都执行一次下面的多条语句:假如(dest)str1='\0'的话说明str1短,返回-1
return -1;
else if (*dest && !*source)//(source)str2='\0'说明str1长,返回1
return 1;
return 0;
}
其实甚至可以更加简单:int strcmp(const char *dest, const char *source)//这个函数看不懂的话可以看2楼
{
while ((*dest++) == (*source++) && *dest && *source);
return dest == source ? 0 : strlen(dest) < strlen(source) ? -1 : 1;//这个strlen可以用我们写的,这个return+三元表达式可以理解成一个分支。
}
这个真好,只有2行,撒花!
本次教程到这里就结束了,有什么bug欢迎在下面告诉我~ |