strncpy&&strncat使用+模拟使用

举报
芒果_Mango 发表于 2022/02/26 21:39:48 2022/02/26
【摘要】 长度不受限制的字符串函数strcpy()strcat()strcmp()上述三个函数不够安全 长度不受限制的字符串函数要么就一直追加/拷贝,直到遇到\0,或者一直比较,直到遇到不相等的字符 长度受限制的字符串函数strncpy()strncat()strncmp() 相对安全 strncpy() - 字符串拷贝函数-可控制拷贝的字符个数count:要拷贝的字符的个数如果要拷贝的字符串长...

长度不受限制的字符串函数

strcpy()
strcat()
strcmp()

上述三个函数不够安全 长度不受限制的字符串函数

要么就一直追加/拷贝,直到遇到\0,或者一直比较,直到遇到不相等的字符


长度受限制的字符串函数

strncpy()
strncat()
strncmp()   

相对安全


strncpy() - 字符串拷贝函数-可控制拷贝的字符个数

image.png
count:要拷贝的字符的个数

如果要拷贝的字符串长度小于count,则拷贝完源字符串之后,在目标的后面追加\0,直到num个

int main()
{
    char arr1[20] = "Lemon-";
    char arr2[] = "Mango";
    strncpy(arr1, arr2, 5);
    printf("%s\n", arr1);   //Mango-
    return 0;
}

int main()
{
    char arr1[20] = "Lemon-";
    char arr2[] = "Mango";
    strncpy(arr1, arr2, 8);
    printf("%s\n", arr1);//Mango
    return 0;
}

当要拷贝的字节数大于源字符串时:超出字节数的补\0

image.png


image.png


模拟实现strncpy()

思路:比strcpy() 多一个参数count,要拷贝的字节个数,通过循环控制拷贝次数,当要拷贝的字节数大于源字符串长度时,在目标空间的后面往后补\0

char* my_strncpy(char* dest,char* src,size_t count)
{
    assert(dest&&src);
    char* ret = dest;   //保存起始空间地址
    while ( (count>0) &&(*src!='\0'))
    {
        *dest++ = *src++;
        count--;
    }
    //判断count是否还大于0,如果还大于0,说明要拷贝的字符个数比源字符串长度大->目标空间往后继续补\0
    if (count > 0)
    {
        while (count--)
        {
            *dest++ = '\0';
        }
    }return ret;
}

简化:

char* my_strncpy(char* dest,char* src,size_t count)
{
    assert(dest&& src);
    char* tmp = dest;
    while(count-- && (*dest++ = *src++))
    {
        ;
    }
    if(count > 0)
    {
        while(count>0)
        {
            count--;
            *dest++ = '\0';
        }
    }
    return tmp;
}

strncat() - 字符串追加函数

image.png

  • 第一个参数:目的地
  • 第二个参数:要追加的字符串
  • 第三个参数:要拷贝的字符个数

int main()
{
    char arr1[20] = "Mango";
    char arr2[] = "Lemon";
    strncat(arr1, arr2, 3);
    printf("%s\n", arr1);   //MangoLem
}

int main()
{
    char arr1[20] = "Mango";
    char arr2[] = "Lemon";
    strncat(arr1, arr2, 8);
    printf("%s\n", arr1);   //MangoLemon
}

当要追加的长度大于(小于)源字符串长度时,追加至源字符串\0位置即停止追加,追加结束后放入\0

int main()
{
    char arr1[20] = "Mangoxxx";
    char arr2[] = "L\0emon";
    strncat(arr1, arr2, 3);
    printf("%s\n", arr1);//MangoL
}
//虽然追加3个字符,但是arr2提前遇到\0,提前终止了

从目标空间的\0位置开始追加,追加完后自动放上\0

image.png


追加后:只追加3个,追加结束后放入\0

image.png

image.png


模拟实现strncat

思路: 1.找到目标空间的\0位置

2.进行拷贝,共拷贝n次,(注意:拷贝过程中,有可能源字符串提前遇到\0,或者要拷贝的长度比源字符串长度长

3.进行判断count是否还>0,如果还>0,说明提前遇到\0,或者源字符串长度比要拷贝的长度短。这样的话,在目标空间追加完的下一个位置补\0

char* my_strncat(char* dest, char* src, size_t count)
{
    assert(dest && src);
    char* tmp = dest;
    //1.找到目标空间\0位置
    while (*dest!='\0')
    {
        dest++;
    }
    //跳出时,dest指向的就是\0,从此处开始拷贝
    while (count-- && (*dest++ = *src++))
    {
        ;
    }
    //追加结束后,补\0
     //上面while拷贝完后,dest指向的是追加完成后的下一个位置,在此位置补\0
        *dest = '\0';
    return tmp;
}
int main()
{
    char arr1[20] = "Mango\0xxxxxx";
    char arr2[] = "Lemon";
    my_strncat(arr1, arr2, 2);
    printf("%s\n", arr1);
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。