为什么str.FirstChar()不返回第一个字符?

时间:2018-10-11 12:47:50

标签: c++builder

 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 :(得分: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);