【C语言】str类与men库函数的实现(如:strcpy,strcmp,strstr,strcat,memmove,memcpy)
来源:互联网 发布:阴线买入指标公式源码 编辑:程序博客网 时间:2024/05/21 10:53
strcpy
拷贝源字符串到子字符串,包括‘\0’。
代码实现:
char* strcpy(char* dst,const char* src){ assert(src); char* ret = dst; while (*src) { *dst = *src; src++; dst++; } *dst = '\0'; return ret;}
2.strncpy:
strncpy与strcpy之间差别在于,strcpy将源字符串全部拷贝到新的字符串中,而strncpy拷贝长度由自己确定。
代码实现:
char* strncpy(char* dst, const char* src, int count){ assert(dst); assert(src); char* ret = dst; while (count--) { *dst = *src; dst++; src++; } *dst = '\0'; return ret;}
3.strcat:
strcat作用是链接字符串,即:
str1: hel str2:lo 则链接后为hello。
代码实现:
char* strcat(char* dst, char* src){ assert(dst); assert(src); char* ret = src; while (*src) { src++; } while (*dst) { *src = *dst; dst++; src++; } *dst = '\0'; return ret;}
4.strcmp:
strcmp用来比较字符串长度。
对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到‘\0’为止。如果全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。
如果两个字符串都由英文字母组成,则有一个简单的规律:在英文字典中位置在后面的为“大”,还要特别注意:小写字母比大写字母“大”。
返回值:
(1)字符串1=字符串2,返回0
(2)字符串1>字符串2,返回一个正整数
(3)字符串1<字符串2,返回一个负整数。
代码实现:
int strcmp(const char* dst, const char* src){ assert(dst); assert(src); while (*src&&*dst) { if (*src == *dst) { src++; dst++; } else { return *src - *dst - '\0'; } } return *src - *dst - '\0';}
5.strncmp:
与strcmp区别在于:strcmp是针对整个字符串而言,而strncmp针对指定长度。
但是要注意,如果count比两者字符串长度都短的话,则要跳出循环结束。当长度大于两者字符串长度时,仍然可以比较出是否相等。
代码实现:
int strncmp(const char* dst, const char* src,size_t count){ assert(dst); assert(src); while (count--&&*src&&*dst) { if (*src == *dst) { src++; dst++; } else { return *src - *dst - '\0'; } } return *src - *dst - '\0';}
6.strstr:
寻找子字符串,我们在源字符串设置一个指针,用做来当此时确实满足是子串标志原串的位置,如下面的p。而s1,s2分别用作来遍历。
代码实现:
char* strstr(const char* dst, const char* src){ assert(dst); assert(src); char* s1 = dst; char* p = src; char* s2 = p; while (*s2) { s1 = dst; s2 = p; while (*s2 && *s1) { if (*s2 == *s1) { s1++; s2++; } else { p++; break; } } if (*s1 == '\0') { return p; } } return NULL;}
7.memcpy:
strcpy完成字符串的拷贝,而对于非字符串类的,却要用memcpy完成内存拷贝。
代码实现:
void* memcpy(void* dst, const void* src, size_t count){ assert(dst); assert(src); char* dst_ = (char*)dst; char* src_ = (char*)src; while (count--) { *dst_++ = *src_++; } //即使此时count不为0,但是当我们将原数拷贝到新的数据结束,那也要结束程序。 *dst_ = '\0';//必须加上结束标志,否则会乱码 return dst;}
8.memmove:
memmove在于它可解决内存重叠问题。
如:将1,2,3,4,5,6,7,8中的1,2,3,4移动到3,4,5,6位置。那么则仍然按照memcpy则会,将1移动到3处,2移动到4处,再准备移动3时发现此时的3已经由于被移动到此处的1覆盖而丢失。4同理。这就是memmove的优势所在。我们分情况即可解决。
代码实现:
void memmove(void* dst, const void* src, size_t count){ assert(dst); assert(src); char* dst_ = (char*)dst; char* src_ = (char*)src; if (dst_ > src_&&dst < dst_ + count) { while (count--) { *(dst_+count) = *(src_+count); dst_++; src_++; } } else { while (count--) { *dst_ = *src_; dst_++; src_++; } } *dst_ = '\0'; return dst;}
本文出自 “Han Jing's Blog” 博客,请务必保留此出处http://10740184.blog.51cto.com/10730184/1765040
- 【C语言】str类与men库函数的实现(如:strcpy,strcmp,strstr,strcat,memmove,memcpy)
- 模拟实现C语言库函数strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove
- 模拟实现C库函数strcpy,strcat,strstr,strchr,strcmp,memcpy,memmove
- strcpy,strcmp,strstr,strcat,memcpy,memmove的模拟实现
- 字符串库函数strcpy strcmp strstr memcpy memmove等的实现
- 模拟库函数(strcpy,strcat,strchr,strstr,strcmp,memcpy,memmove)
- strcpy,strcat,strstr,strcmp,memmove的实现
- 模拟实现strstr,strcpy,strlen,strcat,strcmp,memcpy,memmove
- 模拟实现: strstr strcpy strlen strcat strcmp memcpy memmove
- 模拟实现strlen,strcpy,strcat,strcmp,strstr,memcpy,memmove
- 模拟实现strcpy ,strstr,strcat,strcmp,memcpy,memmove
- 模拟实现strcpy、strcat、strstr、strchr、strcmp、memcpy、memmove
- 字符串处理函数的模拟实现(strlen、strstr、strcat、strcmp、strcpy、memmove、memcpy)
- mem系列函数(memset memcpy memmove) 和str系列函数(strlen strcpy strcmp strcat strstr strtok)
- 模拟实现C库函数:strchr、strcmp、strstr、memcpy和memmove
- 几个常用函数的实现strcpy,memcpy,memmove,strcat,strcmp
- 用c语言.模拟实现strcpy,strcat,strcat,memcpy,memmove
- strcpy(),memcpy(),memmove(),memset(),strcmp(),strstr()的实现
- 【数据结构】(面试题)使用两个栈实现一个队列(详细介绍)
- 【数据结构】对称矩阵及对称矩阵的压缩存储
- zookeeper概要整理
- 【数据结构】稀疏结构及稀疏矩阵的压缩存储,矩阵的(快速)转置
- 【数据结构】广义表的默认成员函数、深度、大小、打印
- 【C语言】str类与men库函数的实现(如:strcpy,strcmp,strstr,strcat,memmove,memcpy)
- 【数据结构】二叉树的实现(如:默认成员函数、(叶子)节点数、深度、四种遍历)
- 【数据结构】二叉树(前、中、后)序遍历的递归与非递归算法
- mfc获取其它程序窗口句柄
- /var/spool/postfix/maildrop/ 中有大量的文件
- 【数据结构】堆的实现(包括:默认成员函数,插元素push,删元素pop,访问根节点top,判空,大小)
- Android平台Native开发与JNI机制详解
- Java之IO操作总结
- 【数据结构】优先级队列的实现(适配器模式)