Почему str.FirstChar () не возвращает первый символ? - PullRequest
0 голосов
/ 11 октября 2018
 UnicodeString us = "12345";
 Label1->Caption= us.FirstChar();

В заголовке будет отображаться «12345» вместо «1».Почему это так?

Страница справки для FirstChar пуста:

Embarcadero Technologies в настоящее время не имеет никакой дополнительной информации.Пожалуйста, помогите нам задокументировать эту тему, используя страницу обсуждения!

Заявление таково:

const WideChar*    FirstChar() const;
const WideChar*    LastChar() const;
WideChar*          FirstChar();
WideChar*          LastChar();

1 Ответ

0 голосов
/ 11 октября 2018

Метод UnicodeString::FirstChar() возвращает указатель на первый символ (так же, как UnicodeString::LastChar() возвращает указатель впоследний символ).

Указываемые данные заканчиваются нулем.Таким образом, утверждение Label1->Caption = us.FirstChar(); такое же, как если бы вы написали Label1->Caption = L"12345"; вместо этого.Свойство TLabel::Caption также является UnicodeString, в котором имеется конструктор, принимающий в качестве ввода указатель WideChar* с нулевым символом в конце.Вот почему вы видите результат, который вы получаете.

Если вам нужен только первый символ, используйте UnicodeString::operator[] вместо:

Label1->Caption = us[1]; // UnicodeString is 1-indexed!

Или,используя FirstChar(), просто разыменяем указатель:

Label1->Caption = *(us.FirstChar());

Обратите внимание, что если метод UnicodeString::IsEmpty() вернет true, оба подхода завершатся неудачно.operator[] сгенерирует исключение ERangeError.FirstChar() вернет указатель NULL, который неопределенное поведение для разыменования.Так что следите за этим, например:

if (!us.IsEmpty())
    Label1->Caption = us[1];
else
    Label1->Caption = _D("");

if (!us.IsEmpty())
    Label1->Caption = *(us.FirstChar());
else
    Label1->Caption = _D("");

Более безопасный вариант - использовать вместо этого метод UnicodeString::SubString(), который вернетпустая строка, если запрошенная подстрока выходит за пределы диапазона:

Label1->Caption = us.SubString(1, 1); // also 1-indexed!

В качестве альтернативы вы можете использовать функцию RTL System::Strutils::LeftStr() вместо:

#include <System.StrUtils.hpp>

Label1->Caption = LeftStr(us, 1);
...