strcpy/strncpy/strcat/strlen等源码

1.strcpy的源码 From Android
代码如下:

?
001
002
003
004
005
006
char * strcpy ( char *dst, const char *src)
{
     char *ret = dst;
     while (*dst++ = *src++) ;
     return ret;
}

再来一份FreeBSD里面的,感觉大牛们的编码方式好奇怪

?
001
002
003
004
005
006
007
008
char *
strcpy ( char * __restrict to, const char * __restrict from)
{
         char *save = to;
 
         for (; (*to = *from); ++from, ++to);
         return (save);
}


2.strncpy是拷贝n个字符
以下来自Android

?
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
char * strncpy ( char *dst, const char *src, size_t n)
{
         if (n != 0) {
                 char *d = dst;
                 const char *s = src;
 
                 do {
                         if ((*d++ = *s++) == 0) {
                                 /* NUL pad the remaining n-1 bytes */
                                 while (--n != 0)
                                         *d++ = 0;
                                 break ;
                         }
                 } while (--n != 0);
         }
         return (dst);
}

再来一份:

?
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
char * strncpy ( char *to, const char *from, size_t count)
{
     register char *ret = to;
 
     while (count > 0) {
         count--;
         if ((*to++ = *from++) == '\0' )
             break ;
     }
 
     while (count > 0) {
         count--;
         *to++ = '\0' ;
     }
 
     return ret;
}

3.strcat是连接两个字符串
以下来自FreeBSD

?
001
002
003
004
005
006
007
008
char * strcat ( char * __restrict s, const char * __restrict append)
{
         char *save = s;
 
         for (; *s; ++s);
         while ((*s++ = *append++));
         return (save);
}

再来一份来自神奇软件Emacs的源码

?
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018
019
020
021
022
023
024
char * strcat ( char *dest, const char *src)
{
   REGISTER char *s1 = dest;
   REGISTER const char *s2 = src;
   char c;
 
   /* Find the end of the string.  */
   do
     c = *s1++;
   while (c != '\0' );
 
   /* Make S1 point before the next character, so we can increment
      it while memory is read (wins on pipelined cpus).  */
   s1 -= 2;
 
   do
     {
       c = *s2++;
       *++s1 = c;
     }
   while (c != '\0' );
 
   return dest;
}

4.strncat是连接两个字符串,只连接源串的n个字符

?
001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
char * strncat ( char *dst, const char *src, size_t n)
{
         if (n != 0) {
                 char *d = dst;
                 const char *s = src;
 
                 while (*d != 0)
                         d++;
                 do {
                         if ((*d = *s++) == 0)
                                 break ;
                         d++;
                 } while (--n != 0);
                 *d = 0;
         }
         return (dst);
}

5.strlen是计算字符串的长度

?
001
002
003
004
005
006
int strlen ( const char *s)
{
     int len = 0;
     while (*s++) len++;
     return len;
}

更多的相关函数自己下载GLIBC下来慢慢看吧,不过C标准的字符串函数都不是安全的函数,需要调用的程序员保证.


转载自:


http://www.stackpop.org/html/206_strcpy_strncpy_strcat_strncat.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值