1. 程式人生 > >C語言:比較兩個字串是否相等

C語言:比較兩個字串是否相等

1) 使用strcmp進行比較

下面通過一個例子進行演示:

#include <stdio.h>
#include <string.h>

int main(void)
{
	char* str1 = "abc";
	char* str2 = "abc";

	if (strcmp(str1, str2) == 0) {
	    printf("str1和str2相同!\n");
	}
	else {
	    printf("str1和str2不相同!\n");
	}

	return 0;
}

講解上面的程式:

定義了一個char(字元型)的指標變數str1,並且初始化為 "abc"

定義了一個char(字元型)的指標變數str2,並且初始化為 "abc"

通過strcmp進行比較兩個字串是否相同,如果相同返回0(詳細見strcmp百度百科)

2) strcmp的實現

int __cdecl strcmp (const char *src, const char *dst)
{
        int ret = 0 ;
        while(!(ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
        {
                ++src;
                ++dst;
        }
        if ( ret < 0 )
                ret = -1 ;
        else if ( ret > 0 )
                ret = 1 ;
        return( ret );
}

下面進行講解:

定義了一個int(整型)的變數ret,並且初始化為0

(unsigned char*) src 表示將src強制轉換為unsigned(無符號)的char(字元型)變數 (同理dst)

*(unsigned char*) src 表示獲取src中的資料(同理dst)

*(unsigned char*) src - *(unsigned char*)dst,

*(unsigned char*) src表示獲取當前src的資料,(假設為"a")

*(unsigned char*)dst表示獲取當前dst的資料,(假設為"a")

根據ASCII碼錶 "a"為65,(ASCII碼錶
)

所以src - dst,所表示的就是 65 - 65,返回結果為0

(ret = *(unsigned char *)src - *(unsigned char *)dst),所以ret 為0

!(ret = *(unsigned char *)src - *(unsigned char *)dst),取反ret

*dst,*dst為獲取dst的資料,因為每個字串的結尾都有一個"\0"(ASCII碼錶中為0)

判斷true和false,其實就是0為false,非0為true,所以可以得出,

如果dst到了字串末尾,則退出迴圈

++src,表示將src的指標向後移動一位(同理dst)(如果這裡不懂的可以看下面)

下面的if...else if則是根據ret的返回值進行返回對應的數值(詳細見strcmp百度百科)

PS :(因為char、unsigned char 都只佔一個字元,所以*src也就獲取當前src所指向的字元)

3)不懂++src的可以看下

++src,表示將src的指標向後移動一位

好的,下面進行講解:

假設當前src的地址為(0x00898b3c),

先說src的型別,當前src的型別為char(字元型),char所佔記憶體大小為1位元組,

所以++src後src的地址就變成了(0x00898b3d),

最後通過++src也就能遍歷整個src所指向的記憶體地址中的資料,然後和dst比較

你們是否不懂為什麼要++呢?(不懂就繼續往下看吧)

首先假設src當前所指向的是 "abc" 的記憶體地址

當前src為(0x00898b3c),所指向的是"a"

所以*src也就是為"a",(可能你們會疑問為什麼是"a")

因為char所佔記憶體大小為1位元組,

所以*src獲取的資料也就只獲取當前src當前所指向的記憶體地址的一位中的資料,

可以這樣理解:

(0x00898b3c)中為"a"

(0x00898b3d)中為"b"

(0x00898b3e)中為"c"

(0x00898b3f)中為"\0"

所以++src就是不斷向後移動指標進行遍歷"abc"中的每個字元