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、也可以寫(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)文章
QT實(shí)戰(zhàn)之打開(kāi)最近圖片功能的實(shí)現(xiàn)
這篇文章主要為大家詳細(xì)介紹了如何利用Qt和QSettings實(shí)現(xiàn)打開(kāi)最近圖片功能,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)QT有一定的幫助,感興趣的可以了解一下2022-06-06C語(yǔ)言判定一棵二叉樹(shù)是否為二叉搜索樹(shù)的方法分析
這篇文章主要介紹了C語(yǔ)言判定一棵二叉樹(shù)是否為二叉搜索樹(shù)的方法,結(jié)合實(shí)例形式綜合對(duì)比分析了C語(yǔ)言針對(duì)二叉搜索樹(shù)判定的原理、算法、效率及相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-08-08MFC控件之CListCtrl的應(yīng)用實(shí)例教程
這篇文章主要介紹了MFC控件中CListCtrl的應(yīng)用方法,包括了針對(duì)表格的一些操作,是MFC中比較重要的一個(gè)控件類(lèi),需要的朋友可以參考下2014-08-08C語(yǔ)言實(shí)現(xiàn)消消樂(lè)游戲的代碼分享
本章我們將編寫(xiě)十字消除游戲,用戶(hù)點(diǎn)擊空白方塊,沿其上下左右方向?qū)ふ业谝粋€(gè)彩色方塊,如果有兩個(gè)或兩個(gè)以上顏色一致,就將其消除,感興趣的可以了解一下2023-02-02c++ 內(nèi)聯(lián)函數(shù)和普通函數(shù)的區(qū)別
內(nèi)聯(lián)函數(shù)是c++為了提高程序的運(yùn)行速度做的改進(jìn),那么內(nèi)聯(lián)函數(shù)和普通函數(shù)的區(qū)別是什么,本文就來(lái)詳細(xì)的介紹一下,感興趣的朋友可以了解一下2021-05-05用位圖排序無(wú)重復(fù)數(shù)據(jù)集實(shí)例代碼(C++版)
本文講解如何用位圖排序無(wú)重復(fù)的數(shù)據(jù)集,我們使用C++實(shí)現(xiàn)一下這個(gè)方法2013-11-11