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、標(biāo)準(zhǔn)規(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。,當(dāng)然這里是同意規(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ū)別是什么,本文就來詳細(xì)的介紹一下,感興趣的朋友可以了解一下2021-05-05
用位圖排序無重復(fù)數(shù)據(jù)集實例代碼(C++版)
本文講解如何用位圖排序無重復(fù)的數(shù)據(jù)集,我們使用C++實現(xiàn)一下這個方法2013-11-11

