C语言-str家族之strncmp

博客基于内核4.9.88,介绍C语言中strncmp函数。阐述其比strcmp多的‘n’含义,分析函数原理是取两字符串值逐个比较。还对比了VC++6.0和Linux中该函数返回值的不同,指出内核代码中同一函数在不同文件定义有差异,不过返回值对判断比较结果影响不大。

/*      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差值呢

### C语言 `strncmp` 函数使用说明 #### 定义与功能 `strncmp` 是 C 语言标准库中的一个函数,用于比较两个字符串的前 n 个字符。如果这两个字符串在这 n 个字符内相同,则返回0;如果不相同则返回非零值表示差异。 #### 声明形式 该函数声明于 `<string.h>` 头文件中,其原型如下所示[^2]: ```c int strncmp(const char *str1, const char *str2, size_t n); ``` 参数解释: - `const char *str1`: 要比较的第一个字符串指针。 - `const char *str2`: 要比较的第二个字符串指针。 - `size_t n`: 需要比较的最大字符数。 返回值含义: 当第一个不同之处位于左串小于右串时返回负数; 完全匹配或指定长度范围内都一致的情况下返回0; 反之亦然,在遇到不相同的字符处左边大于右边会得到正整数值。 #### 实现示例 下面给出一段简单的自定义实现代码作为参考: ```c #include <stdio.h> // 自定义的 strncmp 函数 int My_strncmp(const char* str1, const char* str2, int num) { for (int i = 0; i < num && (str1[i] != '\0' || str2[i] != '\0'); ++i) { if (str1[i] != str2[i]) { return (unsigned char)(str1[i]) - (unsigned char)(str2[i]); } } return 0; } int main() { const char* string1 = "hello"; const char* string2 = "helium"; printf("%d\n", My_strncmp(string1, string2, 3)); // 输出 0 表示前三字符相等 printf("%d\n", My_strncmp(string1, string2, 5)); // 输出负数因为 'o'< 'u' return 0; } ``` 此程序展示了如何创建自己的版本来进行有限范围内的字符串对比操作,并通过具体例子验证了预期行为。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值