2015-12-31 5 views
3

я сравнивал две строки в C++ следующим образом:Сравнение строк с реляционными операторами (различной длины)

if(s1 <= s2) 
    //do stuff 

Я забыл тонкости сравнения строк и быстро понял, что в следующем случае:

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

Заявление будет оцениваться как истинное и делать все, что находится внутри условного. Сравнение происходит между 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» с «.».

Если вы хотите сравнить числовые значения, вам нужно преобразовать строки в их числовое представление, иначе вам придется написать свой собственный компаратор, который обрабатывал строки как числовые. Надеюсь, это проливает свет на него.

Смежные вопросы