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'

  • 相关阅读:
    Add Binary
    Unique Paths II
    APIcloud  SuperWebView
    微信小程序----checkbox组件
    PHP 使用redis  实现队列
    让PHP程序永远在后台运行
    微信小程序----switch组件(开关选择器)
    微信小程序----slider组件
    微信小程序----progress组件
    linux新的数据盘  分区,格式化后  挂载到目录
  • 原文地址:https://www.cnblogs.com/guoyuqiangf8/p/2322421.html
Copyright © 2011-2022 走看看