020-29133788
    资 讯
    您的位置:首页 >> 资 讯 >> 软件应用 >> 编程开发 >> 正文
    字串复制指令 strcpy()、strncpy()说明及使用范例

    点击:   发布日期:2013-01-25

    本文来自 www.020fix.com

    以下的指令说明,是以MSDN上的说明为主
    并其适用于VC++的编译器
    若有不适用于其它C编译器的地方
    还请其它的高手
    代为修改一下

    另外小弟的目的在于能让新手了解指令的说明及方法
    以减少此类问题的发问
    但小弟一个人的力量
    毕竟有限

    所以希望其它高手
    能在有空的时候
    帮忙整理其它常用的指令


    字串复制指令 strcpy()、strncpy()

    (1)strcpy()

    1.指令说明:

    原型为:
    char *strcpy(char *strDestination, const char *strSource);

    参数说明:
    strDestination: 字串复制后要存放的位置(目的地的指标)
    strSource: 字串复制的来源位置(来源的指标)

    输出:
    执行完,后会将strDestination的位置作输出

    2.使用范例:
    ex.
    void main()
    {
            char        szDestination[128] = "ABCDEF";
            char        szSource[] = "123456";

            printf("执行Strcpy()指令前\n");
            printf("szDestination=%s\n", szDestination);

            strcpy(szDestination, szSource);

            printf("执行Strcpy()指令后\n");
            printf("szDestination=%s\n", szDestination);


            system("pause");
    }

    输出:

    执行Strcpy()指令前
    szDestination=ABCDEF
    执行Strcpy()指令后
    szDestination=123456

    3.实作:

    // 实作strcpy指令
    // strDestination ==> 目的字串指标
    // strSource ==> 来源字串指标
    char* MyStrcpy(char *strDestination, const char *strSource)
    {
            char*                p = NULL;
            int                        nCount = 0;

            // 这一个地方,是防止strDestination或strSource是指向NULL,所作的错误侦测
            // 在strcpy() 并没有这个错误侦测的功能
            // 因此strcpy()中,传入NULL参数,会使你的程式挂掉哦
            if(strDestination == NULL || strSource == NULL)
            {
                    return NULL;
            }

            // 将目的字串指标,放到p
            p = strDestination;

            // 若来源字串指标未读到字串结尾'\0'
            // 则继续复制
            while( *(strSource+nCount) != '\0')
            {
                    // 将目前strSource + nCount所指的字元,放到p中(目的字串指标)
                    *p = *(strSource + nCount);

                    // 指向下一个位址(目的字串指标)
                    p++;

                    // 指向下一个位址(来源字串指标)
                    nCount++;
            }

            // 在目的字串指标加上一个字串结尾
            p = '\0';

            // 回传目的字串指标
            return strDestination;
    }

    ps:
    strcpy使用上虽然方便,但是若strSource(来源字串)的字元数,比strDestination(目的字串)
    的阵列所能存放的字元还多时,则会发生阵列爆掉的问题(Buffer Overow);轻者程式挂掉
    ,重者系统安全会出现漏洞,因此建议将strcpy改用strncpy来代替,会比较好

    MSDN对strcpy指令的说明



    (2)strncpy()

    1.指令说明:

    原型为:
    char *strncpy(char *strDest, const char *strSource, size_t count);

    参数说明:
    strDest: 字串复制后要存放的位置(目的地的指标)
    strSource: 字串复制的来源位置(来源的指标)
    count:最多从strSource复制多少个字元到strDest中

    输出:
    执行完,后会将strDest的位置作输出

    2.使用范例:
    ex.
    void main()
    {
            // 强列建议在宣告szDestination前,要先作阵列初使化或在字串阵列的最后一个字元
            // 放入'\0',防止szSource的字元数,比szDestination还大时
            // 在执行完strncpy指令后,会因找不到字串结尾,而引起不必要的错误
            char        szDestination[5] = "ABCD";

            char        szSource[] = "12345689";

            printf("执行strncpy()指令前\n");
            printf("szDestination=%s\n", szDestination);

            // 将szSource字串复制到szDestination中
            // 复制的字元数不能超出szDestination的阵列大小
            // sizeof(szDestination)-1为计算szDestination在预留字串结尾('\0')后
            // 阵列所能存放的空间
            strncpy(szDestination, szSource, sizeof(szDestination)-1);

            printf("执行strncpy()指令后\n");
            printf("szDestination=%s\n", szDestination);


            system("pause");
    }


    输出:

    执行strncpy()指令前
    szDestination=ABCD
    执行strncpy()指令后
    szDestination=1234

    3.实作:

    // 实作strncpy指令
    // strDestination ==> 目的字串指标
    // strSource ==> 来源字串指标
    // count ==> 最多从strSource复制多少个字元到strDestination中
    char* MyStrncpy(char *strDestination, const char *strSource, int count)
    {
            char*                p = NULL;
            int                        nCount = 0;

            // 这一个地方,是防止strDestination或strSource是指向NULL,所作的错误侦测
            // 在strncpy() 并没有这个错误侦测的功能
            // 因此strncpy()中,传入NULL参数,会使你的程式挂掉哦
            if(strDestination == NULL || strSource == NULL)
            {
                    return NULL;
            }

            // 将目的字串指标,放到p
            p = strDestination;

            // 若来源字串指标未读到字串结尾'\0'
            // 而且所复制的字元数,未超过count所设的大小
            // 则继续复制
            while( *(strSource+nCount) != '\0' && count > nCount)
            {
                    // 将目前strSource + nCount所指的字元,放到p中(目的字串指标)
                    *p = *(strSource + nCount);

                    // 指向下一个位址(目的字串指标)
                    p++;

                    // 指向下一个位址(来源字串指标)
                    nCount++;
            }

            if(*(strSource+nCount) == '\0')
            {
                    // 在目的字串指标加上一个字串结尾
                    p = '\0';
            }

            // 回传目的字串指标
            return strDestination;
    }

    MSDN对strncpy指令的说明


    其它字串复制的指令,尚有
    char *_strdup( const char *strSource );
    等不常用的指令
    请自行参阅MSDN的说明