在Delphi中使用Pos()函数查找换行符

4

我通常使用C++Builder,最近开始测试Delphi。我发现在Delphi的(XE5)Pos()函数中找不到换行符,并且其语法很奇怪。我做错了什么?在其他函数中,如StringReplace(),它可以正常工作。这是一个示例代码:

sl := TStringList.Create;
sl.Add('Hello');
sl.Add('world');
sl.Add('!');

if (Pos(sl.Text, #13#10) > 0) then
    ShowMessage('1')
else if (Pos(sl.Text, #13) > 0) then
    ShowMessage('2')
else if (Pos(sl.Text, #10) > 0) then
    ShowMessage('3')
else
    ShowMessage('4');  // Comes always here...

这就是我在C++Builder中一直这样做,并从未遇到过问题的方法。

即使您按正确顺序传递了 Pos 的参数,这仍然是一个奇特的例子,因为 sl.Text 将从内部字符串数组构建生成字符串,使用固定的 EOL 分隔符。 - Stijn Sanders
在字符串方法Pos转换为处理字符串的函数Pos时出现错误是可以理解的,因为在C++中,this是栈上不可见的隐式“第一个”参数。另一方面,遵循文档而不是直觉更加安全。 - Wolf
1个回答

8
您正在错误地传递Pos函数的参数顺序,首先必须传递要搜索的子字符串,然后是缓冲区字符串。请注意调整顺序。
function Pos(const SubStr, Str: _ShortStr; Offset: Integer): Integer;
function Pos(const SubStr, Str: UnicodeString; Offset: Integer): Integer; overload;
function Pos(const SubStr, Str: _WideStr; Offset: Integer): Integer; overload;
function Pos(const SubStr, Str: _RawByteStr; Offset: Integer): Integer;

试试这个

if  Pos(#13#10, sl.Text) > 0 then

或者
if Pos(sLineBreak, sl.Text) > 0 then

3
哦,太感谢了。我只是觉得自己太傻了。在C++Builder中,Pos()函数是字符串的方法,我总是混淆独立函数。 - StanE
1
@jmiller:在XE5中,现在可以调用基本数据类型的方法,包括字符串(通过SysUtils.TStringHelper类),例如:uses SysUtils; if sl.Text.IndexOf(#13#10) > -1 then ...。请注意,此类代码是从0开始计数,而不是从1开始。 - Remy Lebeau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接