鱼C论坛

 找回密码
 立即注册
查看: 2170|回复: 3

[技术交流] 用2~3行代码实现3个库函数!!

[复制链接]
发表于 2018-8-2 19:21:28 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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.strcmp
exturn 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欢迎在下面告诉我~

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +3 收起 理由
erh + 5 + 5 + 3 感谢楼主无私奉献!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-8-2 19:40:54 | 显示全部楼层
int strcmp(const char *dest, const char *source)
{
        while (*dest == *source && *dest && *source);
        return dest == source ? 0 : *dest ? -1 : 1;
}

没理解,能讲解一下吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-8-2 20:00:19 | 显示全部楼层
本帖最后由 无符号整形 于 2018-8-2 20:05 编辑


抱歉,我这里有个bug,改成:
int strcmp(const char *dest, const char *source)
{
        while ((*dest++) == (*source++) && *dest && *source);
        return dest == source ? 0 : strlen(dest) < strlen(source) ? -1 : 1;
}
这个的意思就是不断循环对比它们的每一个字符,假如有任何不同的,或者两个字符串其中一个碰到'\0'跳出循环。
然后判断假如dest==source的话(这个时候因为它们指向的地方相等,表示它们长度相等,而且中间没有跳出循环(假如中间跳出的话肯定会有一个多,另外一个少))就返回0,如果不的话就说明它们不相等,然后测量它们的长度,假如str1<str2的话就返回-1,否则返回1。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-8-7 17:21:23 | 显示全部楼层
谢谢老师!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-10-2 10:23

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表