stl实现memcpy,strcpy,strncpy,memmove
欢迎来到阿八个人博客网站。本 阿八个人博客 网站提供最新的站长新闻,各种互联网资讯。 喜欢本站的朋友可以收藏本站,或者加QQ:我们大家一起来交流技术! URL链接:https://www.abboke.com/jsh/2019/0802/103228.html 1190000019952882
char* strcat(char* des, const char* src) // const表明为输入参数
{
assert((des!=NULL) && (src!=NULL));
char* address = des;
while(*des != '\0') // 移动到字符串末尾
++des;
while(*des++ = *src++)
;
return address;
}
char* strcpy(char* des, const char* src)
{
assert((des!=NULL) && (src!=NULL));
char *address = des;
while((*des++ = *src++) != '\0')
;
return address;
}
int strcmp(const char *s1, const char *s2)
{
while (*s1 == *s2++)
if (*s1++ == '\0')
return (0);
return (*(unsigned char *)s1 - *(unsigned char *)s2);
}
int strlen(const char* str)
{
assert(str != NULL);
int len = 0;
while((*str++) != '\0')
++len;
return len;
}
char *
strcat(char *restrict dst, const char *restrict src) {
const size_t dstlen = strlen(dst);
const size_t srclen = strlen(src);
memcpy(dst+dstlen, src, srclen+1);
return dst;
}
char *
stpcpy(char * restrict dst, const char * restrict src) {
const size_t length = strlen(src);
memcpy(dst, src, length + 1);
return dst + length;
}
char * strncpy(char * restrict dst, const char * restrict src, size_t maxlen) {
const size_t srclen = strnlen(src, maxlen);
if (srclen < maxlen) {
memcpy(dst, src, srclen);
memset(dst+srclen, 0, maxlen-srclen);
} else {
memcpy(dst, src, maxlen);
}
return dst;
}
void *memcpy (void *dstpp, const void *srcpp, size_t len)
{
unsigned long int dstp = (long int) dstpp;
if (len >= sizeof(int*))
{
len -= (-dstp) % sizeof(int*);
BYTE_COPY_FWD (dstpp, srcpp, (-dstp) % sizeof(int*));
WORD_COPY_FWD (dstpp, srcpp, len);
}
BYTE_COPY_FWD (dstpp, srcpp, len);
return dstpp;
}
void BYTE_COPY_FWD(void * dstpp, const void * srcpp, size_t len){
int i=0;
while(i <= len){
((char*)dstpp)[len] = ((char*)srcpp)[len];
i++;
}
}
void WORD_COPY_FWD(void * dstpp, const void * srcpp, size_t& len){
int i=0;
while(i <= len-4){
((int*)dstpp)[len] = ((int*)srcpp)[len];
i+=4;
}
len -= i;
}
void *memmove (void *dstpp, const void *srcpp, size_t len)
{
unsigned long int dstp = (long int) dstpp;
unsigned long int srcp = (long int) srcpp;
if (dstp - srcp >= len)
{
return memcpy(dstpp,srcpp,len);
}else{
srcp += len;
dstp += len;
if (len >= sizeof(int*))
{
len -= (dstp) % sizeof(int*);
BYTE_COPY_BWD (dstpp, srcpp, (dstp) % sizeof(int*));
WORD_COPY_BWD (dstpp, srcpp, len);
}
BYTE_COPY_BWD (dstpp, srcpp, len);
return dstpp;
};
}
void BYTE_COPY_BWD(void * dstpp, const void * srcpp, size_t len){
while(len-- > 0){
((char*)dstpp)[len] = ((char*)srcpp)[len];
}
}
void WORD_COPY_BWD(void * dstpp, const void * srcpp, size_t& len){
while(len >= 4){
((int*)dstpp)[len] = ((int*)srcpp)[len];
len -= 4;
}
}
assert 如果表达式值为假,那么它先向stderr打印错误信息,然后通过调用 abort 来终止程序运行。只在 DEBUG 下生效。宏
危险函数
gets,stpcpy,sprintf等没有检查n直到结尾,会溢出
strncpy,fgetc,read等 当dst长度不足直接在后面补加
fromlng=116.2837, fromlat=40.049619999999997, fromname=云计算创新中心-东南门, fromaddress=海淀区.软件园北街, tolng=116.308211, tolat=40.045464000000003
slat (double) = 40.049779999999998,
02: slng (double) = 116.28313799999999,
03: elat (double) = 40.045520000000003,
04: elng (double) = 116.30843,