#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)个字节),这个规律似乎和字符串的长度有关......