Как использовать широкие строковые литералы в c ++, не ставя перед каждым из них L

Если вы похожи на меня, когда я впервые начал использовать Java, я хотел использовать оператор «==» для проверки того, были ли два экземпляра String одинаковыми, но к лучшему или худшему это не правильный способ сделать это в Java.

В этом уроке я продемонстрирую несколько разных способов правильно сравнить строки Java, начиная с подхода, который я использую большую часть времени. В конце этого руководства по сопоставлению Java String я также обсужу, почему оператор «==» не работает при сравнении строк Java.

Вариант 1: Сравнение строк Java с методом equals Большая часть (возможно, в 95% случаев). Я сравниваю строки с методом equals класса Java String следующим образом:

if (string1.equals(string2))

Этот метод String равен методу для двух строк Java, и если они содержат точно такую ​​же строку символов, они считаются равными.

Взглянув на быстрый пример сравнения строк с методом equals, если был выполнен следующий тест, две строки не будут считаться равными, поскольку символы не являются точно такими же (случай символов различен):

String string1 = "foo";
String string2 = "FOO";

if (string1.equals(string2))
{
    // this line will not print because the
    // java string equals method returns false:
    System.out.println("The two strings are the same.")
}

Но, когда две строки содержат одну и ту же строку символов, метод equals вернет true, как в этот пример:

String string1 = "foo";
String string2 = "foo";

// test for equality with the java string equals method
if (string1.equals(string2))
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

Вариант 2: Сравнение строк с методом equalsIgnoreCase

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

String string1 = "foo";
String string2 = "FOO";

 // java string compare while ignoring case
 if (string1.equalsIgnoreCase(string2))
 {
     // this line WILL print
     System.out.println("Ignoring case, the two strings are the same.")
 }

Вариант 3: сравнение строк Java с методом compareTo

Существует также третий, менее распространенный способ сравнения строк Java, и это с методом сравнения String класса. Если две строки точно совпадают, метод compareTo вернет значение 0 (ноль). Ниже приведен краткий пример того, как выглядит этот метод сравнения строк:

String string1 = "foo bar";
String string2 = "foo bar";

// java string compare example
if (string1.compareTo(string2) == 0)
{
    // this line WILL print
    System.out.println("The two strings are the same.")
}

Пока я пишу об этой концепции равенства в Java, важно отметить, что язык Java включает в себя метод equals в базовый класс Java Object. Всякий раз, когда вы создаете свои собственные объекты, и вы хотите предоставить средства для проверки того, являются ли два экземпляра вашего объекта «равными», вы должны переопределить (и реализовать) этот метод equals в своем классе (точно так же, как язык Java предоставляет это равенство / сравнение в методе String равно).

Вы можете посмотреть на это ==, .equals (), compareTo () и compare ()

13
задан Fry 3 November 2008 в 22:31
поделиться

4 ответа

Нет, нет. Необходимо использовать префикс L (или макрос, такой как _T () с VC ++, который расширяется до L так или иначе, когда скомпилировано для Unicode).

25
ответ дан Ferruccio 3 November 2008 в 22:31
поделиться
  • 1
    О, право. Ну, по крайней мере, это работает точно однажды и таким образом никогда двигатель, чем однажды, даже если существуют десятки, делают правила, расширяющие CFLAGS и AFLAGS. – ndim 23 October 2009 в 09:30

Почему Вы не хотите к литералам строки префиксов с L? Это довольно просто - представляет в виде строки без L, строки ANSI (const char*), строки с L являются строками широкого символа (const wchar_t*). Существует TEXT() макрос, который превращает строковый литерал в ANSI, или строка широкого символа в зависимости от текущего проекта установлена использовать Некод:


#ifdef UNICODE
#define TEXT(s) L ## s
#else
#define TEXT(s) s
#endif

существует также _T() макрос, который эквивалентен TEXT().

1
ответ дан Adam Rosenfield 3 November 2008 в 22:31
поделиться
  • 1
    Я думаю, что Вы правы... Не стесняйтесь предлагать/делать, чтобы редактирования улучшили второй пример. – Amro 11 September 2013 в 02:08

Новый C++ 0x Стандарт определяет другой способ сделать это:
http://en.wikipedia.org/wiki/C%2B%2B0x#New_string_literals

18
ответ дан shoosh 3 November 2008 в 22:31
поделиться
  • 1
    Won' t, что выполненный так или иначе, даже если это doesn' t должны? Вопрос просит его не выполняться, если нет ничего для создания. –  23 October 2009 в 09:24

на связанной ноте.. я пытаюсь сделать следующий

#define  get_switch( m )   myclass::getSwitch(L##m)

, который является макросом, который желание разворачивает

get_switch(isrunning)

в

myclass::getswitch(L"isrunning")

, это хорошо работает в C++ visualstudio 2008

, но когда я компилирую тот же код под Mac XCode (для iPhone), я получаю ошибку:

error: 'L' was not defined in this scope.

РЕДАКТИРОВАНИЕ: Решение

#define  get_switch( m )   myclass::getSwitch(L ## #m)

это работает и над vc ++ и над Mac XCode (gcc)

3
ответ дан ShoeLace 4 November 2008 в 08:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: