字符串相关函数的实现
strcpy和memcpy都是标准C库函数,它们有下面的特点。
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。
已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);
memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。
void *memcpy( void *dest, const void *src, size_t count );
考虑内存重叠的情况:(细节决定成败)
#include "stdafx.h" #include <iostream> using namespace std; char *memorycpy(char *dest, char *src, int len) { if (!dest || !src ||!len || (dest == src)) { return dest; } char *pdest = dest; char *psrc = src; //目标地址高于源地址,从后往前复制 if (dest > src) { pdest = pdest + len - 1; psrc = psrc + len - 1; while(len--) { *pdest-- = *psrc--; } } else //反过来,从前向后复制 { while(len--) { *pdest++ = *psrc++; } } return dest; } int _tmain(int argc, _TCHAR* argv[]) { char *s1 = new char[30]; char *s2; for (int i = 0; i < 10; i++) { *(s1 + i) = 'a' + i; } s2 = s1 + 2; s2 = memorycpy(s2, s1, 3); cout << s2 << endl; delete [] s1; return 0; }
char * strcpy(char * dest, const char * src) // 实现src到dest的复制 { if ((src == NULL) || (dest == NULL)) //判断参数src和dest的有效性 { return NULL; } char *strdest = dest; //保存目标字符串的首地址 while ((*strDest++ = *strSrc++)!='\0'); //把src字符串的内容复制到dest下 return strdest; }
strcpy和memcpy主要有以下3方面的区别。
1、复制的内容不同。strcpy只能复制字符串,而memcpy可以复制任意内容,例如字符数组、整型、结构体、类等。
2、复制的方法不同。strcpy不需要指定长度,它遇到被复制字符的串结束符"\0"才结束,所以容易溢出。memcpy则是根据其第3个参数决定复制的长度。
3、用途不同。通常在复制字符串时用strcpy,而需要复制其他类型数据时则一般用memcpy
void* memset(void* buf,int c,size_t count) { if(buf == NULL) return NULL; char* pvTo = (char*)buf; while (count-- >0) { *pvTo++ = (char)c; } return buf; }
int strcmp(char * src,char *dest) {
if( src == NULL || dest == NULL )
return ERROR;
while ( *src != '\0' && *dest != '\0' && *src == *dest ) { src++; dest++; } if( (*src - *dest) > 0 ) return 1; else if ( (*src - *dest) < 0) return -1; else return 0; }
char *strcat(char *s1,const char *s2) { if ( s1 == NULL || s2 == NULL ) return NULL; char *address=s1; while(*s1++); s1--; while(*s1++=*s2++); return address; }
int atoi (char *s) {
if ( s == NULL )
return ERROR;
int sign=1,num=0; if(*s=='-') sign=-1; s++; while((*s)!='\0') { num=num*10+(*s-'0'); s++; } return num*sign; }
//num : 欲转换的数值 //des : 目标字符串的地址 //radix : 转换后的进制数,可以是10进制、16进制等 // 暂未考虑负数的转化成字符串 char *itoa(int num, char *des, int radix) {
if ( NULL == des )
return NULL;
const char string[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; char* ptr = des;
int j = 0; while (num) { *ptr++ = string[num % radix]; num /= radix; if (num < radix) { *ptr++ = string[num]; *ptr = '\0'; break; } } j = ptr - des - 1; for (int i = 0; i < (ptr - des) / 2; i++) { int temp = des[i]; des[i] = des[j]; des[j--] = temp; } return des; }
posted on 2014-03-19 21:20 theCambrian.cpp 阅读(303) 评论(0) 编辑 收藏 举报