【C语言】str类与men库函数的实现(如:strcpy,strcmp,strstr,strcat,memmove,memcpy)
2016-05-30 17:18
525 查看
strcpy
拷贝源字符串到子字符串,包括‘\0’。
代码实现:
3.strcat:
strcat作用是链接字符串,即:
str1: hel str2:lo 则链接后为hello。
代码实现:
5.strncmp:
与strcmp区别在于:strcmp是针对整个字符串而言,而strncmp针对指定长度。
但是要注意,如果count比两者字符串长度都短的话,则要跳出循环结束。当长度大于两者字符串长度时,仍然可以比较出是否相等。
代码实现:
7.memcpy:
strcpy完成字符串的拷贝,而对于非字符串类的,却要用memcpy完成内存拷贝。
代码实现:
本文出自 “Han Jing's Blog” 博客,请务必保留此出处http://10740184.blog.51cto.com/10730184/1765040
拷贝源字符串到子字符串,包括‘\0’。
代码实现:
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。
代码实现:
4. strcmp用来比较字符串长度。 对两个字符串自左至右逐个字符相比(按ASCII码值大小比较),直到出现不同的字符或遇到‘\0’为止。如果全部字符相同,则认为相等;若出现不相同的字符,则以第一个不相同的字符的比较结果为准。 如果两个字符串都由英文字母组成,则有一个简单的规律:在英文字典中位置在后面的为“大”,还要特别注意:小写字母比大写字母“大”。 返回值: (1)字符串1=字符串2,返回0 (2)字符串1>字符串2,返回一个正整数 (3)字符串1<字符串2,返回一个负整数。 代码实现: [code]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比两者字符串长度都短的话,则要跳出循环结束。当长度大于两者字符串长度时,仍然可以比较出是否相等。
代码实现:
6. 寻找子字符串,我们在源字符串设置一个指针,用做来当此时确实满足是子串标志原串的位置,如下面的p。而s1,s2分别用作来遍历。 代码实现: [code]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完成内存拷贝。
代码实现:
8. 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语言】break,continue的区别
- 【C语言】从标准输入读取字符,所有非字母字符完全按照输入形式输出,字母字符在输出前加密
- c语言:【顺序表】静态顺序表的初始化、打印、尾插、尾删
- c语言:【顺序表】静态顺序表的头插、头删
- c语言:【顺序表】静态顺序表的在指定位置插入元素,以及查找指定元素
- c语言:【顺序表】静态顺序表的删除指定位置元素Erase、删除指定元素Remove
- C语言:【动态顺序表】动态顺序表的初始化、打印、尾插PushBack、尾删PopBack
- C语言:【动态顺序表】动态顺序表的在指定位置插入元素Insert,以及指定元素Find
- 【C语言项目】注释转换
- 【String类浅拷贝的实现】C++:String类引用计数浅拷贝的两种实现
- 【String类】C++:String类的传统写法与现代写法
- 【C++】实现动态顺序表的PushBack(),PopBack(),PushFront(),PopFront(),Find(),Insert
- 【C++】用类实现单向单链表的尾插PushBack(),尾删PopBack(),打印PrintSlist()。
- 【C++】实现双向链表的所有操作,包括逆置双链表(三种方法)
- 【C语言】单链表的所有操作的实现(包括PopBack、PushBack、PopFront、PushFront、Insert)
- 【继承与多态】C++:继承中的赋值兼容规则,子类的成员函数,虚函数(重写),多态
- 【C++】模版类实现普通类静态顺序表
- C语言:使用malloc开辟一个3*4的二维数组,并将内容初始化为1-12.
- C语言:单链表的实现(包括:尾插、尾删、头插、头删、指定位置插入、长度、打印)
- C语言:【单链表】删除一个无头单链表的非尾节点