C語言詳解strcmp函數(shù)的分析及實現(xiàn)
1.函數(shù)介紹
1.1.函數(shù)接口
int __cdecl strcmp (const char * src,const char * dst);
這里是庫函數(shù)里面的函數(shù)定義接口。這個函數(shù)是將 src 和 dst 兩個字符串進行比較,即為字符串比較函數(shù)。
1.2.函數(shù)分析
分析:
1、strcmp 函數(shù)是比較兩個字符串中字符的順序的。實際上是拿其字符的ASCⅡ碼值來進行比較;
2、拿第一個字符串中的第一字符值減去第二個字符串中的第一個字符,如果為 0,則繼續(xù)向下比較;若不為 0,則返回差值的數(shù)。
3、標準規(guī)定:
- 第一個字符串大于第二個字符串,則返回大于 0 的數(shù)字;
- 第一個字符串等于第二個字符串,則返回 0;
- 第一個字符串小于第二個字符串,則返回小于 0 的數(shù)字。
1.3.函數(shù)的簡單使用
#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; }
運行結(jié)果:
為什么這里結(jié)果為1呢而不是其他大于0的數(shù)?來看看下面的分析
1.4.函數(shù)使用結(jié)果分析
分析:
先來看看倆字符串第一個字符在內(nèi)存中的ASCⅡ值:
上面函數(shù)分析里面說了兩個字符的ASCⅡ值進行比較之后,不相等的返回大于0的數(shù);因此這里返回的是1。在vs編譯器的庫函數(shù)中對于strcmp函數(shù)來說,比較兩個字符串ASCⅡ值大于 0 的就都返回 1;小于 0 的就都返回 -1。,當然這里是同意規(guī)定了一下,我們還可以不規(guī)定,直接返回他們的差值,這樣返回的差值也是大于 0 的數(shù)和小于 0 的數(shù)。
2.庫函數(shù)strcmp源代碼
2.1.庫函數(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.庫函數(shù)分析
分析:
1、這里面先用 unsigned char * 將其指針轉(zhuǎn)化為無符號型,在去取里面存的值,即得到字符的ASCⅡ值;
2、return ((-ret) < 0) - (ret < 0); 這一句就是讓差值大于 0 的返回 1;差值小于0的返回 -1。
3.模擬實現(xiàn) strcmp 函數(shù)
3.1.模擬實現(xiàn)
//模擬實現(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比較的是對應(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.模擬實現(xiàn)分析
分析:
1、因為這里是比較兩個字符串,所以字符串都不需要修改,因為都可以用const 修飾;
2、這里模擬實現(xiàn)的時候返回值是兩個字符值的差值。
3、也可以寫為差值大于 0 返回 1 ;差值小于0返回 -1 形式。
以上代碼均可運行,所用編譯環(huán)境為 vs2019 ,運行時注意加上編譯頭文件#define _CRT_SECURE_NO_WARNINGS 1
到此這篇關(guān)于C語言詳解strcmp函數(shù)的分析及實現(xiàn)的文章就介紹到這了,更多相關(guān)C語言strcmp函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
c++ 內(nèi)聯(lián)函數(shù)和普通函數(shù)的區(qū)別
內(nèi)聯(lián)函數(shù)是c++為了提高程序的運行速度做的改進,那么內(nèi)聯(lián)函數(shù)和普通函數(shù)的區(qū)別是什么,本文就來詳細的介紹一下,感興趣的朋友可以了解一下2021-05-05用位圖排序無重復(fù)數(shù)據(jù)集實例代碼(C++版)
本文講解如何用位圖排序無重復(fù)的數(shù)據(jù)集,我們使用C++實現(xiàn)一下這個方法2013-11-11