zoukankan      html  css  js  c++  java
  • strcpy与strncpy工作方式及其区别

    strcpy中的循环语句:

    while ((*strDest++ = *strSrc++) != '\0')

    这个循环会一直执行,直到循环条件为空,即'\0',也就是说,如果strDest所指的存储空间不够大的话,这个函数会将strSrc中的部分内容拷贝到strDest所指内存空间后面的内存中。而strDest所指空间后面的内存却是不可知的,有可能已经被其他资源占用了,这样就会破坏原先存储的内容,导致系统崩溃。

    因为strcpy在执行字符串拷贝的时候,会从strSrc所指位置开始,检测当前内存单元中存储的数据是否为'\0'。如果不为'\0',则将这个内存单元中的数据拷贝到strDest所指向的内存中。如果strSrc中存储的字符串长度大于dst所申请的内存空间的话,就会产生越界,造成不可预知的后果。

    strncpy的函数原型:

        char *strncpy(char *dest, const char *src,int count)

    函数功能

        将字符串src中的count个字符拷贝到字符串dest中去。返回指向s1的指针

    用法解析:

        这个函数和strcpy类似,当src的长度大于dst申请的空间的时候,情况和strcpy一样;

         如果第3个参数count的值大于src中字符串的长度的话,就会将字符串src拷贝到dst中,返回函数。

       注意:如果源串长度大于n,则strncpy不复制最后的'\0'结束符,所以是不安全的,复制完后需要手动添加字符串的结束符才行。

    区别:

    第一种情况:

    1 char* p="how are you ?";
    2 char name[20]="ABCDEFGHIJKLMNOPQRS";

     strcpy(name,p);   //name改变为"how are you ? "     ====>正确!
    strncpy(name,p,sizeof(name))    //name改变为"how are you ?      "       ====>正确!

    经过vc验证:两种都是how are you ?

    第二种情况:

    1 char* p="how are you ?";
    2 char name[20];

    strcpy(name,p);    //name改变为"how are you ? "     ====>正确!
    strncpy(name,p,sizeof(name));        //name改变为"how are you ?      "      ====>正确!

    第三种情况:

    1 char* p="how are you ?";
    2 char name[10];

    strcpy(name,p);      //目标长度小于源串===》错误!
    strncpy(name,p,sizeof(name));      //源串长度大于指定拷贝的长度sizeof(name),在这种情况下不会自动在目标串后面加'\0' 。

    name[sizeof(name)-1]='\0';//和上一步组合,弥补结果

    strncpy
    如果目标长>指定长>源长,则将源长全部拷贝到目标长,自动加上'/0'
    如果指定长<源长,则将源长中按指定长度拷贝到目标字符串,不包括'/0',
    如果指定长>目标长,error happen!

     总结:

    strcpy(),以源串中的'/0'为拷贝结束标志,直到遇到该'\0'为止,然后将'\0'拷贝上.

    strncpy()以第三个参数N为拷贝结束标志,如果source的长度小于N,则剩余的字符全部用'\0'填充.

                  如果source的长度大于N,则从source中截取前N个字符,拷贝过去.不包括'\0'

  • 相关阅读:
    ES6 -- (1) 简介、let、块级作用域、const、顶层对象的属性、globalThis对象
    TS -- (5)声明合并、代码检查
    TS -- (4)类、类与接口、泛型
    TS -- (3)声明文件、内置对象、类型别名、字符串字面量类型、元组、枚举
    TS -- (2)接口、数组的类型、函数的类型
    TS -- (1)环境,快速入门,基础类型,类型断言、变量声明、解构、展开
    css的三定位方式的区别
    Array循环
    scroll操作
    【Nodejs】记一次图像识别的冒险
  • 原文地址:https://www.cnblogs.com/guoyuqiangf8/p/2322421.html
Copyright © 2011-2022 走看看