无符号整形 发表于 2018-8-2 19:21:28

用2~3行代码实现3个库函数!!

本帖最后由 无符号整形 于 2018-8-3 20:44 编辑

strlen、strcpy、strcmp
PS:要想重写一个C标准库函数,关键是要明白它的原型和返回值。
1.strlen
PS:最简单的库函数,哈哈~{:5_109:}
首先打开string.h来看strlen的原型:
exturn size_t strlen(const char * _Str);
我们想一下如何实现?很多朋友会想:
size_tstrlen(const char * _Str)
{
      const char * _Beg;
      while (*_Str != '\0')
      {
                *_Str++;
      }
      return _Str - _Beg - 1;
}
其实可以更简单:
size_tstrlen(const char * _Str)
{
      const char * _Beg = _Str;
      while (*_Str++);//当_Str指向'\0'的时候因为'\0'的ascii码=0,所以自动跳出循环。
      return _Str - _Beg - 1;
}
好了,strlen就实现了。(仅仅3行代码啊!{:10_298:} )
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行,撒花!{:10_298:}

本次教程到这里就结束了,有什么bug欢迎在下面告诉我~{:10_335:}

erh 发表于 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;
}

没理解,能讲解一下吗?

无符号整形 发表于 2018-8-2 20:00:19

本帖最后由 无符号整形 于 2018-8-2 20:05 编辑

erh 发表于 2018-8-2 19:40


抱歉,我这里有个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。

erh 发表于 2018-8-7 17:21:23

谢谢老师!
页: [1]
查看完整版本: 用2~3行代码实现3个库函数!!