欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言詳解strcmp函數(shù)的分析及實(shí)現(xiàn)

 更新時(shí)間:2022年05月09日 16:20:18   作者:<vince>  
strcmp函數(shù)語(yǔ)法為“int strcmp(char *str1,char *str2)”,其作用是比較字符串str1和str2是否相同,如果相同則返回0,如果不同,前者大于后者則返回1,否則返回-1

1.函數(shù)介紹

1.1.函數(shù)接口

int __cdecl strcmp (const char * src,const char * dst);

這里是庫(kù)函數(shù)里面的函數(shù)定義接口。這個(gè)函數(shù)是將 src 和 dst 兩個(gè)字符串進(jìn)行比較,即為字符串比較函數(shù)。

1.2.函數(shù)分析

分析:

1、strcmp 函數(shù)是比較兩個(gè)字符串中字符的順序的。實(shí)際上是拿其字符的ASCⅡ碼值來(lái)進(jìn)行比較;

2、拿第一個(gè)字符串中的第一字符值減去第二個(gè)字符串中的第一個(gè)字符,如果為 0,則繼續(xù)向下比較;若不為 0,則返回差值的數(shù)。

3、標(biāo)準(zhǔn)規(guī)定:

  • 第一個(gè)字符串大于第二個(gè)字符串,則返回大于 0 的數(shù)字;
  • 第一個(gè)字符串等于第二個(gè)字符串,則返回 0;
  • 第一個(gè)字符串小于第二個(gè)字符串,則返回小于 0 的數(shù)字。

1.3.函數(shù)的簡(jiǎn)單使用

#include <stdio.h>
#include <string.h>
int main()
{
	char ch1[] = "fbcd";
	char ch2[] = "ab";
	int ret = strcmp(ch1, ch2);
	printf("%d\n", ret);
	return 0;
}

運(yùn)行結(jié)果:

為什么這里結(jié)果為1呢而不是其他大于0的數(shù)?來(lái)看看下面的分析

1.4.函數(shù)使用結(jié)果分析

分析:

先來(lái)看看倆字符串第一個(gè)字符在內(nèi)存中的ASCⅡ值:

上面函數(shù)分析里面說(shuō)了兩個(gè)字符的ASCⅡ值進(jìn)行比較之后,不相等的返回大于0的數(shù);因此這里返回的是1。在vs編譯器的庫(kù)函數(shù)中對(duì)于strcmp函數(shù)來(lái)說(shuō),比較兩個(gè)字符串ASCⅡ值大于 0 的就都返回 1;小于 0 的就都返回 -1。,當(dāng)然這里是同意規(guī)定了一下,我們還可以不規(guī)定,直接返回他們的差值,這樣返回的差值也是大于 0 的數(shù)和小于 0 的數(shù)。

2.庫(kù)函數(shù)strcmp源代碼

2.1.庫(kù)函數(shù)源代碼

int __cdecl strcmp (const char * src,const char * dst)
{
	int ret = 0 ;
	while((ret = *(unsigned char *)src - *(unsigned char *)dst) == 0 && *dst)
	{
 		++src, ++dst;
 	}
 	return ((-ret) < 0) - (ret < 0); 
 }

2.2.庫(kù)函數(shù)分析

分析:

1、這里面先用 unsigned char * 將其指針轉(zhuǎn)化為無(wú)符號(hào)型,在去取里面存的值,即得到字符的ASCⅡ值;

2、return ((-ret) < 0) - (ret < 0); 這一句就是讓差值大于 0 的返回 1;差值小于0的返回 -1。

3.模擬實(shí)現(xiàn) strcmp 函數(shù)

3.1.模擬實(shí)現(xiàn)

//模擬實(shí)現(xiàn)strcmp函數(shù)
int my_strcmp(const char* str1, const char* str2)
{
	assert(str1 && str2);
	while (*str1 ==  * str)
	{
		if ( *str1 == '\0')
		{
			return 0;
		}
		str1++;
		str2++;
	}
	return *str1 - *str2;
}
int main(void)
{
	//strcmp比較的是對(duì)應(yīng)位置上的字符大小
	char ch1[10] = { 0 };
	char ch2[10] = { 0 };
	scanf("%s", ch1);
	scanf("%s", ch2);
	printf("%d\n", my_strcmp(ch1, ch2));
}

3.2.模擬實(shí)現(xiàn)分析

分析:

1、因?yàn)檫@里是比較兩個(gè)字符串,所以字符串都不需要修改,因?yàn)槎伎梢杂胏onst 修飾;

2、這里模擬實(shí)現(xiàn)的時(shí)候返回值是兩個(gè)字符值的差值。

3、也可以寫(xiě)為差值大于 0 返回 1 ;差值小于0返回 -1 形式。

以上代碼均可運(yùn)行,所用編譯環(huán)境為 vs2019 ,運(yùn)行時(shí)注意加上編譯頭文件#define _CRT_SECURE_NO_WARNINGS 1

到此這篇關(guān)于C語(yǔ)言詳解strcmp函數(shù)的分析及實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C語(yǔ)言strcmp函數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論