strlcpy 和 strlcat 源码

简介:
strlcpy.cpp
None.gifsize_t strlcpy(  char *dst,  const  char *src, size_t siz )
ExpandedBlockStart.gif {
InBlock.gif    char*            d = dst;
InBlock.gif    const char*        s = src;
InBlock.gif    size_t            n = siz;
InBlock.gif
InBlock.gif    if (s == 0 || d == 0) return 0;
InBlock.gif
ExpandedSubBlockStart.gif    /* Copy as many bytes as will fit */
InBlock.gif    if (n != 0 && --n != 0)
ExpandedSubBlockStart.gif    {
InBlock.gif        do
ExpandedSubBlockStart.gif        {
InBlock.gif            if ((*d++ = *s++) == 0)
InBlock.gif                break;
ExpandedSubBlockEnd.gif        }
 while (--n != 0);
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockStart.gif    /* Not enough room in dst, add NUL and traverse rest of src */
InBlock.gif    if (n == 0)
ExpandedSubBlockStart.gif    {
InBlock.gif        if (siz != 0)
ExpandedSubBlockStart.gif            *d = '\0';                /* NUL-terminate dst */
InBlock.gif        while (*s++)
InBlock.gif            ;
ExpandedSubBlockEnd.gif    }

InBlock.gif
ExpandedSubBlockStart.gif    return(s - src - 1);        /* count does not include NUL */
ExpandedBlockEnd.gif}


strlcat.cpp
None.gifsize_t strlcat(  char* dst,  const  char* src, size_t siz )
ExpandedBlockStart.gif {
InBlock.gif    char*        d = dst;
InBlock.gif    const char*    s = src;
InBlock.gif    size_t        n = siz;
InBlock.gif    size_t        dlen;
InBlock.gif
InBlock.gif    if (s == 0 || d == 0) return 0;
InBlock.gif
InBlock.gif    while (n-- != 0 && *d != '\0')
ExpandedSubBlockStart.gif    {
InBlock.gif        d++;
ExpandedSubBlockEnd.gif    }

InBlock.gif    dlen = d - dst;
InBlock.gif    n = siz - dlen;
InBlock.gif
InBlock.gif    if (n == 0)
ExpandedSubBlockStart.gif    {
InBlock.gif        return(dlen + strlen(s));
ExpandedSubBlockEnd.gif    }

InBlock.gif    while (*s != '\0')
ExpandedSubBlockStart.gif    {
InBlock.gif        if (n != 1)
ExpandedSubBlockStart.gif        {
InBlock.gif            *d++ = *s;
InBlock.gif            n--;
ExpandedSubBlockEnd.gif        }

InBlock.gif        s++;
ExpandedSubBlockEnd.gif    }

InBlock.gif    *d = '\0';
InBlock.gif
InBlock.gif    return(dlen + (s - src));
ExpandedBlockEnd.gif}


略作了修改,增加了对空指针的判断.
目录
相关文章
|
5月前
|
算法 NoSQL 安全
30万的源码和300的源码有什么区别?
价格差异巨大的源码(30万对300)主要区别在于质量、完整性和技术支持。高质量源码通常有清晰结构、高效算法、良好文档,提供全面的技术支持,安全稳定且来自信誉良好的开发者。而低价源码可能存在问题、缺乏文档和支持。选择时需结合实际需求,注意测试和评估。示例中的AI导诊系统和云HIS系统源码,提供完整文档、数据库和二次开发支持,适用于不同场景,能有效提升开发效率和项目质量。
30万的源码和300的源码有什么区别?
|
5月前
看源码的方法
看源码的方法
85 1
|
11月前
|
JavaScript
源码
源码
|
12月前
|
程序员 开发工具 C++
|
消息中间件 网络协议 Java
eventMesh源码学习
eventMesh源码学习
187 0
|
安全 Java
ReentranLock源码学习
线程的三大特性:原子性、可见性、有序性。也就是说满足这个三个特性的操作都是可以保证安全的,如Atomic包、volatile、通过happensBefore原则可以进行线程的安全的判断,这个依据通常是为了避免jvm指令重排。比如通常我们知道的配置信息,如果有多个线程去进行配置信息的修改,则需要进行上锁。或者多个线程修改一个变量时,此时就需要进行上锁了,或者读写分离时,可以考虑ReentrantReadWriteLock等。其本质是解决并行中的问题,将并行转成串行问题进行解决。那怎么上锁才有用呢?锁的状态大部分情况下是互斥的。当然也有特例:ReentrantReadWriteLock的读读是不会
90 0
ReentranLock源码学习
|
存储 人工智能 安全
C++学习必备——文章中含有源码
C++学习必备——文章中含有源码
118 0
C++学习必备——文章中含有源码
openFrameworks下的肤色检测源码
openFrameworks下的肤色检测源码
162 0
|
存储 Android开发 C++
看Ogrekit源码的小结
看Ogrekit源码的小结
105 0
|
算法 NoSQL 前端开发
为什么要看源码、如何看源码,高手进阶必看
为什么要看源码、如何看源码,高手进阶必看
261 0