strcmp函数
int strcmp ( const char * str1, const char * str2 );
1.第一个字符串大于第二个字符串,则返回大于0的数字
2.第一个字符串等于第二个字符串,则返回0
3.第一个字符串小于第二个字符串,则返回小于0的数字
如何判断两个字符串呢?
假设有如下两个字符串:
char* m = "abcdef"; char* n = "abce"; strcmp(m, n);
首先是两个字符串的第一个字符比较,很明显相等,再比较下一个字符,直到字符 ‘d’ 与 ‘e’ 比较,字符 ‘d’ 是小于 ‘e’ 的,所以m指向的字符串小于n指向的字符串。
#include<stdio.h> #include<string.h> int main() { char* m = "abcdef"; char* n = "abce"; printf("%d", strcmp(m, n)); return 0; }
输出:-1
模拟实现
#include<stdio.h> int m_strcmp(const char* str1, const char* str2) { while (*str1 == *str2) { if (*str1 == '\0') return 0; str1++; str2++; } if (*str1 > *str2) return 1; if (*str1 < *str2) return -1; } int main() { char* m = "abcdef"; char* n = "abca"; printf("%d", m_strcmp(m, n)); return 0; }
输出:1
strncmp函数
int strncmp ( const char * str1, const char * str2, size_t num );
比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完。
有兴趣可以自己实现一下。
strstr函数
char * strstr ( const char *str1, const char * str2);
1.返回指向 str1 中第一次出现的 str2 的指针,如果 str2 不是 str1 的一部分,则返回空指针。
2.匹配过程不包括终止空字符,但它在那里停止。
int main() { char* m = "abcdef"; char* n = "cde"; printf("%s", strstr(m, n)); return 0; }
输出:cdef
模拟实现
char * strstr ( const char *str1, const char * str2);
char* m_strstr(const char* str1, const char* str2) { const char* s1 = str1; //见下图,s1 标记目标字符串每次开始查找的首元素 const char* s2 = str2; // s2 标记源字符串每次开始查找的首元素 const char* p = str1; // p 标记每次从 s1 开始遍历的元素 if (*str2 == '\0') { return str1; } while (*p) { s1 = p; s2 = str2; //每次循环开始将 s1 移到后一个元素处,s2 移到首元素处 while (*s1 != '\0' && *s2 != '\0' && (*s1 == *s2)) { s1++; s2++; } if (*s2 == '\0') //当源字符串遍历完了后即找到了 { return (char*)p; } p++; } return NULL; //找不到子串 } int main() { char* m = "abcdef"; char* n = "cde"; printf("%s", m_strstr(m, n)); return 0; }
当第一次没找到后,第二次循环 s1 、p指向如图:
若 p 指向 ‘\0’ ,则表示找不到该字符串,退出循环。
memcpy函数
void * memcpy ( void * destination, const void * source, size_t num );
1.函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。
2.这个函数在遇到 ‘\0’ 的时候并不会停下来。
3.如果source和destination有任何的重叠,复制的结果都是未定义的。
int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int arr2[10] = { 0 }; memcpy(arr2, arr, 20); return 0; }
我们来看看内存分配情况:
由图可以看出memcpy函数改变了20字节的内容,也就是5个整型,改变了5个整型数,那么它是什么方式改变这20字节的呢?
从左到右一个字节一个字节的依次复制,直到20个字节。
模拟实现
void* m_memcpy(void* destination, const void* source, size_t num) { void* p = destination; while (num--) //循环num次 { *(char*)destination = *(char*)source; //char型访问一个字节,方便逐个字节打印 destination = (char*)destination + 1; source = (char*)source + 1; } return p; } int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int arr2[10] = { 0 }; m_memcpy(arr2, arr, 20); return 0; }