日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言詳解strcmp函數的分析及實現_C 語言

作者:<vince> ? 更新時間: 2022-07-03 編程語言

1.函數介紹

1.1.函數接口

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

這里是庫函數里面的函數定義接口。這個函數是將 src 和 dst 兩個字符串進行比較,即為字符串比較函數。

1.2.函數分析

分析:

1、strcmp 函數是比較兩個字符串中字符的順序的。實際上是拿其字符的ASCⅡ碼值來進行比較;

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

3、標準規定:

  • 第一個字符串大于第二個字符串,則返回大于 0 的數字;
  • 第一個字符串等于第二個字符串,則返回 0;
  • 第一個字符串小于第二個字符串,則返回小于 0 的數字。

1.3.函數的簡單使用

#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;
}

運行結果:

為什么這里結果為1呢而不是其他大于0的數?來看看下面的分析

1.4.函數使用結果分析

分析:

先來看看倆字符串第一個字符在內存中的ASCⅡ值:

上面函數分析里面說了兩個字符的ASCⅡ值進行比較之后,不相等的返回大于0的數;因此這里返回的是1。在vs編譯器的庫函數中對于strcmp函數來說,比較兩個字符串ASCⅡ值大于 0 的就都返回 1;小于 0 的就都返回 -1。,當然這里是同意規定了一下,我們還可以不規定,直接返回他們的差值,這樣返回的差值也是大于 0 的數和小于 0 的數。

2.庫函數strcmp源代碼

2.1.庫函數源代碼

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.庫函數分析

分析:

1、這里面先用 unsigned char * 將其指針轉化為無符號型,在去取里面存的值,即得到字符的ASCⅡ值;

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

3.模擬實現 strcmp 函數

3.1.模擬實現

//模擬實現strcmp函數
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比較的是對應位置上的字符大小
	char ch1[10] = { 0 };
	char ch2[10] = { 0 };
	scanf("%s", ch1);
	scanf("%s", ch2);
	printf("%d\n", my_strcmp(ch1, ch2));
}

3.2.模擬實現分析

分析:

1、因為這里是比較兩個字符串,所以字符串都不需要修改,因為都可以用const 修飾;

2、這里模擬實現的時候返回值是兩個字符值的差值。

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

以上代碼均可運行,所用編譯環境為 vs2019 ,運行時注意加上編譯頭文件#define _CRT_SECURE_NO_WARNINGS 1

原文鏈接:https://blog.csdn.net/m0_56817529/article/details/124640919

欄目分類
最近更新