首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

:gnu strncpy 的实现代码看不懂

2012-02-12 
求救:gnu strncpy 的实现代码看不懂.gnu 中 strncpy 的实现代码看不懂.,大家帮解释一下,让我理解它:C/C++

求救:gnu strncpy 的实现代码看不懂.
gnu 中 strncpy 的实现代码看不懂.,大家帮解释一下,让我理解它:

C/C++ code
 
char* __strncpy(char* dest, const char* src, size_t n)
{
char c;
char *s = dest;
if (n >= 4)
    {
size_t n4 = n >> 2;
for (;;)
{
c = *src++;
*dest++ = c;
if (c == '\0')
break;
c = *src++;
*dest++ = c;
if (c == '\0')
break;
c = *src++;
*dest++ = c;
if (c == '\0')
break;
c = *src++;
*dest++ = c;
if (c == '\0')
break;
if (--n4 == 0)
goto last_chars;
}
n -= dest - s;
goto zero_fill;
    }
last_chars:
n &= 3;
if (n == 0)
return dest;
for (;;)
    {
c = *src++;
--n;
*dest++ = c;
if (c == '\0')
break;
if (n == 0)
return dest;
    }
zero_fill:
while (n-- > 0)
dest[n] = '\0';
return dest - 1;
}


[解决办法]
C/C++ code
char* __strncpy(char* dest, const char* src, size_t n){    char c;    char *s = dest;    if (n >= 4) //如果大于4的话,即 二进制大于 100    {        size_t n4 = n >> 2; //右移两位跟大于4联系发现这样移位后能大于0        for (;;)//死循环一次拷贝四个字节,如果遇到0跳出,将剩余空间填0,否则每次拷贝4个字节直到拷贝完4的整数倍个字符        {            c = *src++;            *dest++ = c;            if (c == '\0')                break;            c = *src++;            *dest++ = c;            if (c == '\0')                break;            c = *src++;            *dest++ = c;            if (c == '\0')                break;            c = *src++;            *dest++ = c;            if (c == '\0')                break;            if (--n4 == 0)                goto last_chars;// 不足4的整数倍        }        n -= dest - s;// 拷贝了多少个字符        goto zero_fill;//遇到了0,于是剩余均填0    }last_chars://不足4的部分    n &= 3;//还有字符没?    if (n == 0)//没了返回        return dest;        for (;;)//有的话继续拷贝,结束填0    {        c = *src++;        --n;        *dest++ = c;        if (c == '\0')            break;        if (n == 0)            return dest;    }    zero_fill://遇到o后,全部填零    while (n-- > 0)        dest[n] = '\0';        return dest - 1;}
[解决办法]
一次拷贝4字节自然比一次拷贝1字节快.

热点排行