2015-12-31 106 views
3

我是用C比較兩個字符串++如下:關係運算符(不同長度)的字符串比較

if(s1 <= s2) 
    //do stuff 

我已經忘記了字符串比較的複雜性和迅速地瞭解到以下情況:

s1 = "10.72"; 
s2 = "8.87"; 

該聲明將評估爲true,並執行條件內的任何操作。在8和1.所有ASCII數字表示是在從48遞增的順序之間的比較情況(0) - 57(9),並且顯然1 < 8.

我曾認爲C++考慮到串長度但這是不正確的。有人會介意解釋爲什麼從C++語言設計的角度不考慮長度?

+0

dfri打我回答,但是如果你想做上面的比較,我會建議先使用'std :: stof'轉換爲浮點數,然後比較浮點數,例如'float f1 = std :: stof(s1)'then'if(f1 <= f2)'。 – silvergasp

回答

3

實際上,通過字典學比較可以隱含地考慮長度,當您在字符串上調用小於<或小於或等於<=的運算符時將使用該長度。

  • 兩個範圍進行比較,由元件元件。

  • 第一失配元件限定其範圍是字典順序小於或大於其它

  • 如果一個範圍是另一個前綴,較短範圍是字典順序比其它以下。

  • 如果兩個範圍具有等效元素並且具有相同長度,則範圍在詞典上是相等的。

http://en.cppreference.com/w/cpp/algorithm/lexicographical_compare

因此,作爲一個例子

"10.72" < "10.721" // true 
"10.72" == "10.72" // true (by string comparison as well as lexicographically equalness) 
"10.7211" < "10.7212" // true 

爲什麼,你問?這不是C++的複雜性,而是如何比較字符串,其中字典比較是最常見的(在我看來,最合理的)比較方法之一。

+0

完美!謝謝! – jonnyd42

+0

@ jonnyd42樂意幫忙! – dfri

0

長度考慮到了,但不符合您的預期。在字符串比較中,每個字符串的第一個字符先相互比較。如果它們相等,則比較第二個字符等等。所以在你的例子中,要比較的第一個字符是'1'和'8'。 '8'更大。

如果您將「10.72」與「1.87」進行比較,則第一個字符會相同,因此接下來將比較「0」和「。」。

如果要比較數字值,則必須將字符串轉換爲其數字表示形式,否則必須編寫自己的比較器,將字符串視爲數字。我希望能夠對此有所瞭解。