strcmp函式實現及分析

2021-06-18 05:08:40 字數 3417 閱讀 1433

strcmp函式是c/c++中基本的函式,它對兩個字串進行比較,然後返回比較結果,函式形式如下:

int strcmp(const char* str1, const char* str2);

其中str1和str2可以是字串常量或者字串變數,返回值為整形。返回結果如下規定:

① str1小於str2,返回負值或者-1(vc返回-1);                    

③ str1大於str2,返回正值或者1(vc返回1);

strcmp函式實際上是對字元的ascii碼進行比較,實現原理如下:首先比較兩個串的第乙個字元,若不相等,則停止比較並得出兩個ascii碼大小比較的結果;如果相等就接著 比較第二個字元然後第三個字元等等。無論兩個字串是什麼樣,strcmp函式最多比較到其中乙個字串遇到結束符'/0'為止,就能得出結果。strcmp演算法的可以有多種,不過我覺的可以把這麼多演算法分為兩種,一種是利用減法運算判斷結果,另一種是利用比較運算(==)得出結果。

減法運算的實現的**如下:

[cpp]view plain

copy

print?

int strcmp(const

char* str1, const

char* str2)  

if (ret < 0)  

else

if (ret > 0)  

return 0;  

}  

int strcmp(const char* str1, const char* str2)

if (ret < 0)

else if (ret > 0)

return 0;

}

這個函式要注意一下幾點

①使用*(unsigned char*)str1而不是用*str1。這是因為傳入的引數為有符號數,有符號字元值的範圍是-128~127,無符號字元值的範圍是0~255,而字串的ascii沒有負值,若不轉化為無符號數這回在減法實現時出現錯誤。

例如 str1的值為1,str2的值為255。

作為無符號數計算時ret = -254,結果為負值,正確

作為有符號數計算時ret = 2,結果為正值,錯誤

②while迴圈中ret=*(unsigned char*)str1-*(unsigned char*)str2) && *str1,最後與上str1也可以換成str2,因為前面已經做了相減,無論哪個先為『\0』都會退出。因為最後與上str1是為了判斷str1是否結束,即是否為『\0』。

③這個函式沒有判斷引數為null時的情況,所以當傳入null時程式會崩潰。網上看別人說商業化**都會在呼叫strcmp前先判斷是否為null,所以可以不用判斷null;我在vc6上測試string.h中的strcmp(null,null),程式也會崩潰。這裡可以根據實際情況來決定。

若要判斷null按下面方法更改**,可以在這個函式最前面加入斷言

assert((null != str1) && (null != str2))

但要注意斷言assert 是僅在debug 版本起作用的巨集,是在debug時做的無害測試。若想在release 版也可

以判斷null,那我們必須用別的**來判斷。

可以在程式前面加入if判斷

if ((null != str1) && (null != str2))

我用cfree 5測試sting.h中的strcmp(null,null),程式返回值為0(strcmp(null,str1)崩潰),這裡我們可以返回其他的值如 -2。

我們也可以在函式前面加入while判斷

while ((null != str1) && (null != str2))

return 0;

利用while就可以把每個字元都進行判斷。

利用比較運算(==)演算法如下

[cpp]view plain

copy

print?

int strcmp(const

char* str1, const

char* str2)  

if (*(unsigned char*)str1 > *(unsigned char*)str2)  

else

if (*(unsigned char*)str1 < *(unsigned char*)str2)  

else

}  

int strcmp(const char* str1, const char* str2)

if (*(unsigned char*)str1 > *(unsigned char*)str2)

else if (*(unsigned char*)str1 < *(unsigned char*)str2)

else

}

函式注意點和上面一樣,有一點要注意不要為了簡潔而寫成下面

[cpp]view plain

copy

print?

int strcmp(const

char *str1,const

char *str2)  

if (*(unsigned char*)str1 > *(unsigned char*)str2)  

else

if (*(unsigned char*)str1 < *(unsigned char*)str2)  

else

}  

int strcmp(const char *str1,const char *str2)

if (*(unsigned char*)str1 > *(unsigned char*)str2)

else if (*(unsigned char*)str1 < *(unsigned char*)str2)

else

}

當str1為abcd,st2為abfd時,由於判斷到第三個字元時while推出,而str指標又加了1,str都指向第四個字元輸出結果為0,顯然這是錯誤的。

這個函式也可以用for來實現

[cpp]view plain

copy

print?

int strcmp(const

char *str1, const

char *str2)  

if (*(unsigned char*)str1 > *(unsigned char*)str2)  

else

if (*(unsigned char*)str1 < *(unsigned char*)str2)  

//如果只返回正負的話可以用 return *(unsigned char*)str1 - *(unsigned char*)str2;

}  

**:

strcmp函式實現及分析

最近看c,看到strcmp函式,對它的實現原型不很清楚,於是到網上搜。網上演算法一大堆,看了很多 後自己做了一下總結 str1等於str2,返回0 str1大於str2,返回正值或者1 vc返回1 strcmp函式實際上是對字元的ascii碼進行比較,實現原理如下 首先比較兩個串的第乙個字元,若不相...

strcmp函式實現

功能 比較字串s1和s2大小。一般形式 int strcmp 字串1,字串2 說明 當s1s2時,返回 1 即兩個字串自左向右逐個字元相比 按ascii值大小相比較 直到出現不同的字元或遇 0 為止。include using namespace std int strcmp const char ...

strcmp函式的實現

6 實現strcmp函式的功能,要求按照先比字元後比長度的方式。include int stringlength char array return arraylength int stringcmp char array1,char array2 else if array1 i if i str...