C語(yǔ)言詳解strcmp函數(shù)的分析及實(shí)現(xiàn)
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、也可以寫為差值大于 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)文章
C語(yǔ)言實(shí)現(xiàn)括號(hào)配對(duì)的方法示例
本文主要介紹了C語(yǔ)言實(shí)現(xiàn)括號(hào)配對(duì)的方法示例,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-09-09
C++通用動(dòng)態(tài)抽象工廠的實(shí)現(xiàn)詳解
在面向?qū)ο蟮木幊讨?一般通過(guò)繼承和虛函數(shù)來(lái)提供抽象能力,下面這篇文章主要給大家介紹了關(guān)于C++通用動(dòng)態(tài)抽象工廠的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-07-07
c++ 判斷是64位還是32位系統(tǒng)的實(shí)例
這篇文章主要介紹了c++ 判斷是64位還是32位系統(tǒng)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-12-12
VSCode添加頭文件(C/C++)的實(shí)現(xiàn)示例
這篇文章主要介紹了VSCode添加頭文件(C/C++)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
C語(yǔ)言 如何求兩整數(shù)的最大公約數(shù)與最小公倍數(shù)
這篇文章主要介紹了C語(yǔ)言中如何求兩整數(shù)的最大公約數(shù)與最小公倍數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
使用C語(yǔ)言實(shí)現(xiàn)內(nèi)存池的示例代碼
所謂內(nèi)存池,顧名思義和線程池的設(shè)計(jì)原理是一樣的,為了減少頻繁申請(qǐng)釋放內(nèi)存而帶來(lái)的資源消耗,減少釋放內(nèi)存后產(chǎn)生的內(nèi)存碎片,下面我們就來(lái)看看如何使用C語(yǔ)言實(shí)現(xiàn)內(nèi)存池吧2024-02-02

