判斷字符串相等


 1 #include <iostream> 
 2 #include <cstring>//support for strcmp(),也可寫成#include "string.h" 
 3 using namespace std;
 4 
 5 int main()
 6 {
 7     const char *str1 = "abc";
 8     const char *str2 = "abc";
 9     char str3[4] = "abc";//{'a','b','c'};
10     char str4[4] = "abc";//{'a','b','c'};
11     string str5 = "abc";
12     string str6 = "abc";
13     cout<<&str3<<" " <<&str4<<endl;
14     cout<<&"abc"<<" " <<&"abc"<<" "<<&"abc"<<endl;
15     cout<<"str1 == str2: "<<(str1 == str2)<<endl;
16     cout<<"*str1 == *str2: "<<(*str1 == *str2)<<endl;
17     cout<<"str3 == str4: "<<(str3 == str4)<<endl;
18     cout<<"str3 > str4: "<<(str3 > str4)<<endl;
19     cout<<"strcmp(str3,str4): "<<strcmp(str3,str4)<<endl;//char數組標准的判斷相等函數 
20     cout<<"str5 == str6: "<<(str5 == str6)<<endl;
21     /**
22     輸出:
23     0x28fe92 0x28fe8e
24     0x47f000 0x47f000 0x47f000
25     str1 == str2: 1
26     *str1 == *str2: 1
27     str3 == str4: 0
28     str3 > str4: 1
29     strcmp(str3,str4): 0
30     str5 == str6: 1
31     */
32     
33     return 0;
34 }
35 /**
36 strcmp()函數解析:
37  
38 頭文件:#include <string.h>
39 
40 strcmp() 用來比較字符串(區分大小寫),其原型為:
41     int strcmp(const char *s1, const char *s2);
42 
43 【參數】s1, s2 為需要比較的兩個字符串。
44 
45 字符串大小的比較是以ASCII 碼表上的順序來決定,此順序亦為字符的值。
46 strcmp()首先將s1 第一個字符值減去s2 第一個字符值,
47 若差值為0 則再繼續比較下個字符,若差值不為0 則將差值返回。
48 例如字符串"Ac"和"ba"比較則會返回字符"A"(65)和'b'(98)的差值(-33)。
49 
50 【返回值】若參數s1 和s2 字符串相同則返回0。s1 若大於s2 則返回大於0 的值。s1 若小於s2 則返回小於0 的值。
51 
52 */ 

(1)str1和str2是char*,也就是一個指針,然后它們都來自於"abc"的賦值,通過直接輸出"abc"的地址可以發現都是相等的,因為它是一個const string,存放在全局數據區當中,對str1和str2的初始化,C++只會建立一個"abc" const string,從而str1和str2這兩個指針指向的是同一塊內存,也就是說str1和str2的值(是那塊同樣的內存的地址值)是相等的,於是str1 == str2就解釋得通了。

 

(2)*str1 ==  *str2因為取的是同一塊內存里面的東西,自然也是相等。

(3)再看char[]數組,無論是

  char str3[] = "abc";

還是

  char str3[] = {'a','b','c'};

其過程都是將元素逐一復制到str3數組當中,它並不存在指針指向一個const string一說,並且str3表示的是數組的首地址,同理str4.直接拿str3 == str4來作比較,也即拿這兩個char數組的首地址的值來比較,自然是不相等的,str3數組的首地址比str4的首地址要大,也就是str3 > str4返回的是1(true),所以注意這里是拿它們的地址來作比較。

 

所以str1 == str2  與 str3 == str4:一個是常量字符串(位於內存四區中的數據區中的常量區)的指針(地址)比較,一個是數組(棧內存)地址比較。

關於C/C++語言的內存四區模型理解:參考下面的博客:

C語言之內存四區模型和函數調用模型

(4)來到strcmp函數,這個函數是用來比較兩個char *字符串的大小,如果兩個字符串相等則返回0,前面的比后面的大則返回1,反之則返回-1,所以用這個函數才能判斷出str3和str4代表的字符串是相等的,前面的只是拿地址來比較,而不是內容的比較。因為在C語言中,char數組(C風格字符串)並不支持直接使用==來判斷字符串相等,需要調用函數才能達到目的。

(5)至於string,跟(1)差不多的原理,而且C++的string本來就支持直接使用“==”來比較兩個字符串是否相等(運算符重載的支持)。

 

參考文檔:http://blog.csdn.net/lv_victor/article/details/52578320


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM