/* PC上食用更佳哦!
基于内核4.9.88,至于为什么要看内核,我觉得看内核了解其原理,和man搭配使用效果更好
date:2022年7月6日11:06:30
*/
strncmp,比strcmp多了个n,n代表什么呢?
man一下看看
![]()


描述的很清楚,strncmp只比较前面n个bytes
内核代码,lib目录中:
int strncmp(const char *cs, const char *ct, size_t count)
{
unsigned char c1, c2;
while (count) {
c1 = *cs++;
c2 = *ct++;
if (c1 != c2)
return c1 < c2 ? -1 : 1;
if (!c1)
break;
count--;
}
return 0;
}
这是size_t的类型
typedef long unsigned int size_t;
原理:取两个字符串的值逐个比较,只有当c1 != c2 时判断c1和c2谁大,这里的大小是ASCII值
如下:
A,a,b,c在ASCII表中对应的十进制值分别是65,97,98,99
strncmp(a, b, 2):起初,c1和c2都是"A",两者相等,且 !c1 = 0,执行count--,
第二个字符比较时,c1 = c = 99,c2 = a = 97,条件c1 != c2为真,执行
return c1 < c2 ? -1 : 1; 因为c1 > c2,所以返回1
其余两个比较原理一致
#include <stdio.h>
#include <string.h>
void main(){
char *a = "Ac";
char *b = "Aa";
char *c = "ba";
char *d = "Ac";
printf("strncmp(a, b, 2) : %d\n", strncmp(a, b, 2));
printf("strncmp(a, c, 2) : %d\n", strncmp(a, c, 2));
printf("strncmp(a, d, 2) : %d\n", strncmp(a, d, 2));
}
VC++6.0中的返回值:

Linux中的返回值:

好奇怪哦,为啥会不一样,按照源码来说返回值应该只有0,-1,1才对啊,而Linux下还是返回ASCII值的差值,man手册中的说明也是和strcmp一样返回ASCII差值
最后我发现,在内核代码中同一个函数,在不同文件中的定义也不完全一样,可能是体系不同导致的吧。像strcmp就是有两种定义,一个是返回0,-1,1。一个定义返回ASCII差值
证据在这儿:
lib目录下定义

arch\x86\boot目录下定义

不过返回值是什么对我们影响都不大,我们只是用这些函数判断比较部分是否相等,只要不是0就表示不相等,管他0,-1,1和ASCII差值呢
博客基于内核4.9.88,介绍C语言中strncmp函数。阐述其比strcmp多的‘n’含义,分析函数原理是取两字符串值逐个比较。还对比了VC++6.0和Linux中该函数返回值的不同,指出内核代码中同一函数在不同文件定义有差异,不过返回值对判断比较结果影响不大。
4785

被折叠的 条评论
为什么被折叠?



