strcpy memcpy等相关函数实现
2013-05-12 11:37
330 查看
1.strcpy memcpy
strcpy和memcpy都是标准C库函数,它们有下面的特点。
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。
已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);
memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。
实现:
char* my_strcpy(char* dst, const char* src)
{
char* tmp = dst;
assert(NULL != dst && NULL != src);
while((*tmp++ = *src++) != '\0');
return dst;
}
void* my_memcpy(void* dst, const void* src, int len)
{
assert(NULL != dst && NULL != src);
char* tdst = (char *)dst;
char* tsrc = (char *)src;
while(len-- > 0) *tdst++ = *tsrc++;
return dst;
}
2.sizeof strlen
sizeof(...)是运算符,在头文件中typedef为unsigned
int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到
遇到结束符NULL。返回的长度大小不包括NULL.
实现:
int my_strlen(const char* str)
{
assert(NULL != str);
char* tmp = str;
while(*(++tmp) != '\0');
return tmp - str;
}
3.strcmp memcmp
对于memcmp(),如果两个字符串相同而且count大于字符串长度的话,memcmp不会在\0处停下来,会继续比较\0后面的内存单元,直到_res不为零或者达到count次数。
对于strncmp(),由于((__res = *cs - *ct++) != 0 || !*cs++)的存在,比较必定会在最短的字符串的末尾停下来,即使count还未为零。具体的例子:
char a1[]="ABCD";
char a2[]="ABCD";
对于memcmp(a1,a2,10),memcmp在两个字符串的\0之后继续比较
对于strncmp(a1,a2,10),strncmp在两个字符串的末尾停下,不再继续比较。
所以,如果想使用memcmp比较字符串,要保证count不能超过最短字符串的长度,否则结果有可能是错误的。
strcpy和memcpy都是标准C库函数,它们有下面的特点。
strcpy提供了字符串的复制。即strcpy只用于字符串复制,并且它不仅复制字符串内容之外,还会复制字符串的结束符。
已知strcpy函数的原型是:char* strcpy(char* dest, const char* src);
memcpy提供了一般内存的复制。即memcpy对于需要复制的内容没有限制,因此用途更广。
实现:
char* my_strcpy(char* dst, const char* src)
{
char* tmp = dst;
assert(NULL != dst && NULL != src);
while((*tmp++ = *src++) != '\0');
return dst;
}
void* my_memcpy(void* dst, const void* src, int len)
{
assert(NULL != dst && NULL != src);
char* tdst = (char *)dst;
char* tsrc = (char *)src;
while(len-- > 0) *tdst++ = *tsrc++;
return dst;
}
2.sizeof strlen
sizeof(...)是运算符,在头文件中typedef为unsigned
int,其值在编译时即计算好了,参数可以是数组、指针、类型、对象、函数等。
它的功能是:获得保证能容纳实现所建立的最大对象的字节大小。
strlen(...)是函数,要在运行时才能计算。参数必须是字符型指针(char*)。当数组名作为参数传入时,实际上数组就退化成指针了。
它的功能是:返回字符串的长度。该字符串可能是自己定义的,也可能是内存中随机的,该函数实际完成的功能是从代表该字符串的第一个地址开始遍历,直到
遇到结束符NULL。返回的长度大小不包括NULL.
实现:
int my_strlen(const char* str)
{
assert(NULL != str);
char* tmp = str;
while(*(++tmp) != '\0');
return tmp - str;
}
3.strcmp memcmp
对于memcmp(),如果两个字符串相同而且count大于字符串长度的话,memcmp不会在\0处停下来,会继续比较\0后面的内存单元,直到_res不为零或者达到count次数。
对于strncmp(),由于((__res = *cs - *ct++) != 0 || !*cs++)的存在,比较必定会在最短的字符串的末尾停下来,即使count还未为零。具体的例子:
char a1[]="ABCD";
char a2[]="ABCD";
对于memcmp(a1,a2,10),memcmp在两个字符串的\0之后继续比较
对于strncmp(a1,a2,10),strncmp在两个字符串的末尾停下,不再继续比较。
所以,如果想使用memcmp比较字符串,要保证count不能超过最短字符串的长度,否则结果有可能是错误的。
相关文章推荐
- strcpy strcat等相关函数的实现
- Linux下IPC机制实现相关函数
- 在WordPress中实现发送http请求的相关函数解析
- (十一)linux下用c语言 实现file流的刷新和定位的相关函数
- 菜鸟学习历程【8】 string相关库函数的自我实现
- 自己实现string类的相关函数
- 双向链表的Java实现,以及相关函数的实现
- MFC 窗体按钮的按键的实现和字符串的相关处理函数的问题
- 使用相关函数实现PHP处理分页
- 多线程实现相关函数
- <笔试><面试>C/C++单链表(最综合)最全工程从建立到相关函数实现
- 字符串相关函数的实现
- 【DLL相关】实现函数的DLL封装,并在另一个项目中调用
- <笔试><面试>C/C++单链表(最综合)最全工程从建立到相关函数实现
- 链表及相关函数实现
- JavaScript中如何使用cookie实现记住密码功能及cookie相关函数介绍
- 对WDK中对LIST_ENTRY的操作的相关函数的实现及简单运用
- 二叉树的实现及相关函数的实现
- windwos sockets实现及其相关函数简介
- VC++ 获取跳转后的url函数实现及相关资料