迷一般的strcpy

#include "stdafx.h"


#include <string.h>
#include <stdio.h>
#include <stdlib.h>


//#define _TEST_STRING_COPY_FAKE_   // Fake Standard implement
//#define _TEST_STRING_COPY_5J_     // Simulate the Microsoft API
#define _TEST_STRING_COPY_MS_       // Microsoft Standard API
//#define _TEST_MEM_COPY_FAKE_


#ifdef _TEST_STRING_COPY_FAKE_
char *t_strcpy(char *dest, const char *src)
{
    char *p_tmp = dest;

    while ((*p_tmp++ = *src++) != '/0');

    return dest;
}
#endif

#ifdef _TEST_STRING_COPY_5J_
// Simulate strcpy in the case of that OFFSET
// between 2 buffer is 1byte
char *o_strcpy(char *dest, const char *src)
{
    char *p_rtn = dest;
    char *p_i = (char*)src;
    int *pi_dest = NULL, *pi_src = NULL;
    int i;

    pi_dest = (int*)dest;
    pi_src = (int*)p_i;

    while (1)
    {
        i = 4;

        // Search for termination
        while (i)
        {
            i--;
            if (*p_i == '/0')
                break;
            else
                p_i++;
        }

        // Copy data 4 bytes per time
        // If it's in the last 4byte
        // ...
        if (i == 0)
            *pi_dest++ = *pi_src++;
        else
        {
            i = 4 - i;
            while (i--)
                *((char*)pi_dest + i) = *((char*)pi_src + i);

            return p_rtn;
        }
    }

    return p_rtn;
}
#endif


void test_for_n(int offset)
{
    char *p_str = (char*)malloc(100);
    char *p_dest = NULL, *p_src = NULL;

#ifdef _TEST_STRING_COPY_FAKE_
    t_strcpy(
#elif defined(_TEST_STRING_COPY_5J_)
    o_strcpy(
#elif defined(_TEST_STRING_COPY_MS_)
    strcpy(
#elif defined(_TEST_MEM_COPY_FAKE_)
#elif defined(_TEST_MEM_COPY_MS_)
#endif
    p_str, "abcdefghijklmnopqrstuvwxyz");

    p_src = p_str;
    p_dest = p_str + offset;

#ifdef _TEST_STRING_COPY_FAKE_
    t_strcpy(p_dest, p_src);
#elif defined(_TEST_STRING_COPY_5J_)
    o_strcpy(p_dest, p_src);
#elif defined(_TEST_STRING_COPY_MS_)
    strcpy(p_dest, p_src);
#endif

    printf("test_for_%d: %s/n", offset, p_dest);
    free(p_str);
}


void main(void)
{
    test_for_n(1);
    test_for_n(2);
    test_for_n(3);
//    test_for_n(4);
//    test_for_n(5);
    test_for_n(6);
    test_for_n(7);
    test_for_n(8);
    test_for_n(9);
    test_for_n(10);
}

t_strcpy()是我们普遍认为的strcpy的实现,然而,通过本程序可以证明strcpy绝对不是如此实现的,这个测试程序是要求使用strcpy对同一个字符串进行操作,在这个特定前提下,你会发现strcpy返回的结果让你大吃一惊

o_strcpy()是我总结其中一种情况之后写的一个模拟strcpy的程序

通过测试,我只能粗浅地估计strcpy的规律,它并不是我们认为的按照单字节拷贝,但也不是固定字节的拷贝,而是依照一定的规律(2的N幂(N>=0)个字节),这个规律似乎和字符串的长度有关......

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值