函数 strncpy、strncat、strncmp、strrchr 的实现

上次说了一些比较简单的关于字符串的函数,今天说几个有点意思的关于字符串的函数。

1. strncpy

  • 头文件: #include<string.h>
  • 功能:复制字符串src中的内容(字符,数字、汉字….)到字符串dest中,复制多少由size_t n的值决定。如果src的前n个字符不含NULL字符,则结果不会以NULL字符结束。如果n<src的长度,只是将src的前n个字符复制到dest的前n个字符,不自动添加'\0',也就是结果dest不包括'\0',需要再手动添加一个'\0'。如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。srcdest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符长度加上'\0'
char * my_strncpy(char * dest, const char * source, size_t count)
{
    char *start = dest;

    while (count && (*dest++ = *source++))   //复制字符串
        count--;

    if (count)                              //后续都赋‘\0’
    while (--count)
        *dest++ = '\0';

    return(start);
}
  • src串长度<= dest串长度,(这里的串长度包含串尾NULL字符) 如果n>src由于长度达到srcNULL,正常复制,特别注意,如果src中有NULLstrncpy复制到NULL即使没到n也提前停止。如果n =src串长度,与strcpy一致。注意n的选择当n > dest串长度,dest栈空间溢出产生崩溃异常。
  • src串长度> dest串长度 如果n=dest串长度,则dest串没有NULL字符,会导致输出会有乱码。如果不考虑src串复制完整性,可以将dest 最后一字符置为NULL
  • 使用strncpy时,建议将n置为dest串长度(除非你将多个src串都复制到dest数组,并且从dest尾部反向操作),复制完毕后,为保险起见,将dest串最后一字符置NULL,避免发生前面那种情况下的输出乱码问题。当然喽,无论是strcpy还是strncpy,保证dest串容量(能容纳下src串)才是最重要的。
  • 当然了,还有momcpymommove字符串复制函数,已经在我的前一个博客中介绍,其中mommove更加好用。

2. strncat

  • 头文件:#include <string.h>
  • 功能:把src所指字符串的前n个字符添加到dest所指字符串的结尾处,并覆盖dest所指字符串结尾的'\0',从而实现字符串的连接。
  • 说明:srcdest所指内存区域不可以重叠,并且dest必须有足够的空间来容纳src的字符串。
  • 返回值:返回指向dest的指针。
char * my_strncat(char * dest, const char * src, size_t count)
{
    char *start = dest;

    while (*dest++)
        ;
    dest--;

    while (count--)
    if (!(*dest++ = *src++))
        return(start);

    *dest = '\0';
    return(start);
}
  • strncatstrcat的好处就在于它可以指定要连接的个数。其他的到没有什么可说的。还有strncat需要手动在字符串最后赋值。

3. strncmp

  • 功能:这个函数用来比较s1s2字符串的前count个字符。若str1str2的前n个字符相同,则返回0;若s1大于s2,则返回大于0的值;若s1 若小于s2,则返回小于0的值。
  • 函数 strncmpstrcmp极为类似。不同之处是,strncmp函数是指定比较count个字符。也就是说,如果字符串s1s2的前count个字符相同,函数返回值为0
int my_strncmp(const char *first, const char *last, size_t count)
{
    size_t x = 0;

    if (!count)
    {
        return 0;
    }

    if (count >= 4)
    {
        for (; x < count - 4; x += 4)   //count大于4时,就4个元素放在一起判断
        {
            first += 4;
            last += 4;

            if (*(first - 4) == 0 || *(first - 4) != *(last - 4))
            {
                return(*(unsigned char *)(first - 4) - *(unsigned char *)(last - 4));
            }

            if (*(first - 3) == 0 || *(first - 3) != *(last - 3))
            {
                return(*(unsigned char *)(first - 3) - *(unsigned char *)(last - 3));
            }

            if (*(first - 2) == 0 || *(first - 2) != *(last - 2))
            {
                return(*(unsigned char *)(first - 2) - *(unsigned char *)(last - 2));
            }

            if (*(first - 1) == 0 || *(first - 1) != *(last - 1))
            {
                return(*(unsigned char *)(first - 1) - *(unsigned char *)(last - 1));
            }
        }
    }

    for (; x < count; x++)
    {
        if (*first == 0 || *first != *last)
        {
            return(*(unsigned char *)first - *(unsigned char *)last);
        }
        first += 1;
        last += 1;
    }

    return 0;
}
  • strncmpstrcmp基本上就是一样的,就是strncmp可以指定比较的元素个数。
  • 另外,strncmp函数比较的时候,如果count大于4,那么函数就会把4个元素4个元素的比较。

4. strrchr

  • 头文件: string.h
  • 功能:strrchr函数查找字符在指定字符串中从后面开始的第一次出现的位置,如果成功,则返回从该位置到字符串结尾的所有字符,如果失败,则返回
    NULL。与之相对应的是strchr函数,它查找字符串中首次出现指定字符的位置。
char * my_strrchr( const char * string, int ch )
{
    char *start = (char *)string;

    while (*string++)                       /*找到字符串的末尾 */
        ;
    /* 从后往前寻找字符 */
    while (--string != start && *string != (char)ch)
        ;

    if (*string == (char)ch)                /* 判断是否找到 */
        return((char *)string);

    return(NULL);
}
  • strrchrstrchr刚好相反,strchr找的是字符串中字符第一次出现的位置;strrchr找的是字符串中字符最后一次出现的位置。
  • 实现strrchr的时候定义一个指针,让它指向字符串末尾,然后直接从后往前找就ok。

对于C语言的函数我还在更新中,希望大家给予支持!^_^

猜你喜欢

转载自blog.csdn.net/qq_40421919/article/details/80271790
今日推荐