#include "stdafx.h"
#include <string.h>
#include <windows.h>
#include <time.h>
int _tmain(int argc, _TCHAR* argv[])
{
char sstr[256]="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
SYSTEMTIME btime;
SYSTEMTIME endtime;
int i=0;
int j;
GetSystemTime(&btime);
printf("for begintime = %02d:%02d:%02d.%04d/n",btime.wHour,btime.wMinute,btime.wSecond,btime.wMilliseconds);
i=0;
while ( i < 10000000 )
{
char tempstr1[256] = {0};
for (j=0;j<100;j++)
tempstr1[j]=sstr[j];
i++;
}
GetSystemTime(&endtime);
printf("for endtime = %02d:%02d:%02d.%04d/n",endtime.wHour,endtime.wMinute,endtime.wSecond,endtime.wMilliseconds);
GetSystemTime(&btime);
printf("sprintf begintime = %02d:%02d:%02d.%04d/n",btime.wHour,btime.wMinute,btime.wSecond,btime.wMilliseconds);
i=0;
while ( i < 10000000 )
{
char tempstr[256] = {0};
sprintf(tempstr,"%s",sstr);
i++;
}
GetSystemTime(&endtime);
printf("sprintf endtime = %02d:%02d:%02d.%04d/n",endtime.wHour,endtime.wMinute,endtime.wSecond,endtime.wMilliseconds);
GetSystemTime(&btime);
printf("strcpy begintime = %02d:%02d:%02d.%04d/n",btime.wHour,btime.wMinute,btime.wSecond,btime.wMilliseconds);
i=0;
while ( i < 10000000 )
{
char tempstr1[256] = {0};
strcpy(tempstr1,sstr);
i++;
}
GetSystemTime(&endtime);
printf("strcpy endtime = %02d:%02d:%02d.%04d/n",endtime.wHour,endtime.wMinute,endtime.wSecond,endtime.wMilliseconds);
GetSystemTime(&btime);
printf("strncpy begintime = %02d:%02d:%02d.%04d/n",btime.wHour,btime.wMinute,btime.wSecond,btime.wMilliseconds);
i=0;
while ( i < 10000000 )
{
char tempstr1[256] = {0};
strncpy(tempstr1,sstr,100);
i++;
}
GetSystemTime(&endtime);
printf("strncpy endtime = %02d:%02d:%02d.%04d/n",endtime.wHour,endtime.wMinute,endtime.wSecond,endtime.wMilliseconds);
GetSystemTime(&btime);
printf("memcpy begintime = %02d:%02d:%02d.%04d/n",btime.wHour,btime.wMinute,btime.wSecond,btime.wMilliseconds);
i=0;
while ( i < 10000000 )
{
char tempstr1[256] = {0};
memcpy(tempstr1,sstr,100);
i++;
}
GetSystemTime(&endtime);
printf("memcpy endtime = %02d:%02d:%02d.%04d/n",endtime.wHour,endtime.wMinute,endtime.wSecond,endtime.wMilliseconds);
return 0;
}
测试结果i:
for begintime = 05:17:33.0201
for endtime = 05:17:36.0368
sprintf begintime = 05:17:36.0368
sprintf endtime = 05:17:56.0571
strcpy begintime = 05:17:56.0571
strcpy endtime = 05:17:57.0198
strncpy begintime = 05:17:57.0199
strncpy endtime = 05:17:57.0820
memcpy begintime= 05:17:57.0820
memcpy endtime = 05:17:58.0236
无疑strcpy是最快的
说明:
1.char *strcpy(char *dest, const char *src)
完成从源字符串到目的字符串的拷贝功能,必须确保目标字符串的空间足够容纳源字符串;strcpy是以'/0'为结束标志的;strcpy是字符串 拷贝,遇0则停;效率高且调用方便。
const char *str1="abc/0def";
char str2[7];
strcpy(str2,str1)
得到结果:str2="abc";也就是说,strcpy是以'/0'为结束标志的。
strncpy 会复制一个以 '' 结束的字符串,但是如果字符串长度超过指定数量则被截断,但结果可能不包含 '' 表示结束
2.void *memcpy(void *dest, const void *src, size_t n);
memcpy 的操作对象不局限于某一类数据类型,或者说可 适用于任意数据类型,只要能给出对象的起始地址和内存长度信息、并且对象具有可操作性即可。鉴于 memcpy 函数等长拷贝的特点以及数据类型代表的物理意义,memcpy 函数通常限于同种类型数据或对象之间的拷贝,其中当然也包括字符串拷贝以及基本数据类型的拷贝。
memcpy 虽然高效,但是需要额外提供拷贝的内存长度这一参数,易错且使用不便;并且如果长度指定过大的话(最优长度是源字符串长度 + 1),还会带来性能的下降。对于基本数据类型来说,尽管可以用 memcpy 进行拷贝,由于有赋值运算符可以方便且高效地进行同种或兼容类型的数据之间的拷贝,所以这种情况下 memcpy 几乎不被使用。
memcpy(str2,str1,7);
得到结果:str2="abc/0def";
3.int sprintf(char *restrict,size_t n,const char *restrict,...)
sprintf 的格式控制串中既然可以插入各种东西,并最终把它们“连成一串”,自然也就能够连接字符串,但不能直接连接没有以' '结尾的字符数组,如果直接连接,肯定会导致非法内存操作,那该怎么办呢?我们自然会想起前面介绍打印整数和浮点数时可以指定宽度,字符串也一样的。
sprintf(ch,"%s%10d","3sdfasdf",3);
sprintf(s, "%8d", 123); //产生:" 123"
右对齐,不足的左边补0:
sprintf(s, "%08X", 4567); //产生:"000011D7"
当然也可以左对齐:
sprintf(s, "%-8d", 123); //产生:"123 "
snprintf 函数操作的对象 不限于字符串:虽然目的对象是字符串,但是源对象可以是字符串、也可以是任意基本类型的数据。这个函数主要用来实现 (字符串或基本数据类型)向 字符串 的转换 功能。如果源对象是字符串,并且指定 %s 格式符,也可实现字符串拷贝功能。
要额外指定格式符并且进行格式转化,麻烦且效率不高。