求救: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字节快.