Сравнение строк C ++ - PullRequest
       16

Сравнение строк C ++

4 голосов
/ 23 декабря 2010
#include "stdafx.h"
#include "iostream"
#include "string"

using namespace std;

void main()
{
string a = "a";
string b(1, -70); /*constructor, create a string having 1 character that its value is equal to -70*/
cout<<((b>a)?b:a);
}

//output on screen: b was printed, not a (!)

Почему b> a, хотя значение b меньше значения a? Как я могу исправить эту ситуацию?

Ответы [ 3 ]

3 голосов
/ 23 декабря 2010

На VS2010 я обнаружил, что символ был подписан - следовательно, не нужное объяснение. Проходя через отладчик по сравнению, я в итоге нажал код:

template<> struct char_traits<char>
 { // properties of a string or stream char element
 typedef char _Elem;
 typedef _Elem char_type;
 typedef int int_type;
 typedef streampos pos_type;
 typedef streamoff off_type;
 typedef _Mbstatet state_type;

 static int __CLRCALL_OR_CDECL compare(const _Elem *_First1, const _Elem *_First2,
  size_t _Count)
  { // compare [_First1, _First1 + _Count) with [_First2, ...)
  return (_CSTD memcmp(_First1, _First2, _Count));
  }
// etc
};

Таким образом, реальное сравнение сводится к memcmp . Проверяя это, мы находим «оцененные как значения без знака», отсюда и проблема.

Cf. Ответ Арытома - Интересно, я этого не знал. Глядя на это:

Стандарт 1998 года 21.1.3.1:6 на состояния char_traits 'lt' определяется идентично встроенному оператору <. </p>

В черновике N3126, 21.2.3.1:5 говорится, что он должен быть таким же, как и для беззнакового символа.

2 голосов
/ 23 декабря 2010

Строки всегда сравниваются как unsigned char независимо от значимости действительного символа.

std::string взял это поведение от C, где strcmp использует символы в диапазоне 0-255, даже если char находится в диапазоне -128 - 127.

Таким образом, в основном -70 - это 186 и 186> 'a'

Редактировать: Ссылка на стандарт. У меня нет C ++ 98/2003 рядом со мной, только C ++ 0x, но:

«Рабочий проект, Стандарт для языка программирования C ++», N2915, 21.2.3.1, примечание 5 гласит:

Члены с двумя аргументами eq и lt должны быть определены идентично встроенным операторам == и <для типа unsigned char. </p>

т.е. символы сравниваются как беззнаковый символ (ссылается на специализацию черт характера для символа)

1 голос
/ 23 декабря 2010

См. Двоичное эквивалентное значение -70 как 1 символ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...