UnicodeString us = "12345";
Label1->Caption= us.FirstChar();
标题将显示为“ 12345”而不是“ 1”。 为什么会这样?
FirstChar的帮助页面为空:
Embarcadero Technologies当前没有任何其他 信息。请通过使用 讨论页面!
声明是这样的:
const WideChar* FirstChar() const;
const WideChar* LastChar() const;
WideChar* FirstChar();
WideChar* LastChar();
答案 0 :(得分:3)
UnicodeString::FirstChar()
方法将 pointer 返回第一个字符(就像UnicodeString::LastChar()
方法将 pointer 返回最后一个字符一样。< / p>
所指向的数据为空终止。因此,语句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);