2015-12-31 104 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”和“。”。

如果要比较数字值,则必须将字符串转换为其数字表示形式,否则必须编写自己的比较器,将字符串视为数字。我希望能够对此有所了解。