系列文章目录
深度剖析:strcat & strncat
深度剖析:strchr & strstr
深度剖析:strcmp & strncmp
深度剖析:strcpy & strncpy
深度剖析:strlen & strtok
深度剖析:memcpy & memmove
深度剖析:memset & memcmp
前言
库函数string是我们经常使用也是非常重要的代码,我将会对常用的函数的用法和实现原理进行深度剖析
一、strcmp
1.调用结构
int strcmp(const char *str1, const char *str2);
2.使用详解
strcmp:把 str1 所指向的字符串和 str2 所指向的字符串进行比较
原理详解:
- 比较ASCII码值
- 第一个字符串 > 第二个字符串,则返回 大于0 的数字
- 第一个字符串 = 第二个字符串,则返回 0
- 第一个字符串 < 第二个字符串,则返回 小于0 的数字
3.源码剖析
int Strcmp(char const *s1, char const *s2) {
//比较:把 str1 所指向的字符串和 str2 所指向的字符串进行比较。
assert(s1 && s2); //防止传入空指针
while (*s1 == *s2 && *s1 != 0 && *s2 != 0) { //比较字符串
s1++;
s2++;
}
return *s1 - *s2; //返回比较结果
}
二、strncmp
1.调用结构
int strncmp(const char *str1, const char *str2, size_t n);
2.使用详解
strncmp:把 str1 和 str2 进行比较,最多比较前 n 个字节
原理详解:
- 比较到出现另个字符不一样或者一个字符串结束或者num个字符全部比较完
- 第一个字符串 > 第二个字符串,则返回 大于0 的数字
- 第一个字符串 = 第二个字符串,则返回 0
- 第一个字符串 < 第二个字符串,则返回 小于0 的数字
3.源码剖析
int Strncmp(char const *s1, char const *s2, int len) {
//比较:把 str1 和 str2 进行比较,最多比较前 n 个字节
assert(s1 && s2); //防止传入空指针
while (len-- && *s1 == *s2 && *s1 != '\0' && *s2 != '\0') { //比较 n 个字节的字符串
s1++;
s2++;
}
return *s1 - *s2; //返回比较结果
}