String Delphi Pos始终返回0
我真的不知道为什么Pos总是返回0而不是字符串中的字符“;”位置 我必须得到一个php页面的响应,该页面输出一个内容类型:text/plain 因此,一个示例输出是String Delphi Pos始终返回0,string,web-services,delphi,indy,String,Web Services,Delphi,Indy,我真的不知道为什么Pos总是返回0而不是字符串中的字符“;”位置 我必须得到一个php页面的响应,该页面输出一个内容类型:text/plain 因此,一个示例输出是 2;富拉诺;富拉诺;0 3.西克拉诺;西克拉诺;0 4.贝尔特拉诺;贝尔特拉诺;0 5.傅;傅;0 8.何塞;何塞;0 9;玛丽亚;玛丽亚;0 代码是 var linha,uid,login,senha,email,tipo : WideString; resposta : TStringList; I : Intege
2;富拉诺;富拉诺;0
3.西克拉诺;西克拉诺;0
4.贝尔特拉诺;贝尔特拉诺;0
5.傅;傅;0
8.何塞;何塞;0
9;玛丽亚;玛丽亚;0
代码是
var
linha,uid,login,senha,email,tipo : WideString;
resposta : TStringList;
I : Integer;
begin
try
resposta := TStringList.Create;
resposta.Text := frmMain.IdHTTP1.Get(frmMain.cdsConfig.FieldByName('WebService').AsString+'listdest.php');
for I := 0 to resposta.Count-1 do
begin
linha := resposta.Strings[i];
if i = 0 then
Delete(linha,1,1); // the first line have one wierd $FEFF
if length(linha) > 5 then
begin
uid := Copy(linha,1,Pos(linha,';')-1);
Delete(linha,1,Pos(linha,';'));
login:=Copy(linha,1,Pos(linha,';')-1);
Delete(linha,1,Pos(linha,';'));
senha:=Copy(linha,1,Pos(linha,';')-1);
Delete(linha,1,Pos(linha,';'));
email:=Copy(linha,1,Pos(linha,';')-1);
Delete(linha,1,Pos(linha,';'));
tipo:=Copy(linha,1,Pos(linha,';')-1);
Delete(linha,1,Pos(linha,';'));
end;
end;
//dlgWait.Close;
except on E :Exception do
begin
MessageBox(Self.Handle,PWideChar(E.Message),'Erro',MB_OK+MB_ICONERROR+MB_APPLMODAL);
dlgWait.Close;
FreeAndNil(resposta);
end;
end;
您对
Pos
的呼叫是反向的。参数包括:
function Pos(const SubStr, Str: _ShortStr; Offset: Integer): Integer;
但您的代码假定它们是:
function Pos(const Str, SubStr: _ShortStr; Offset: Integer): Integer;
所以实际上它要做的是在中查找linha
的值;'代码>,当然,除非linha
,它将返回0
另一种说法是,正如Rudy所说,代码不是在大海捞针,而是在大海捞针
交换这些调用的第一个和第二个参数
顺便说一句,这只是一个性能提示。与其每次调用
Pos
两次,不如保留该值的缓存副本
P := Pos(';', linha);
uid := Copy(linha,1,P-1);
Delete(linha,1,P);
您对
Pos
的呼叫是反向的。参数包括:
function Pos(const SubStr, Str: _ShortStr; Offset: Integer): Integer;
但您的代码假定它们是:
function Pos(const Str, SubStr: _ShortStr; Offset: Integer): Integer;
所以实际上它要做的是在中查找linha
的值;'代码>,当然,除非linha
,它将返回0
另一种说法是,正如Rudy所说,代码不是在大海捞针,而是在大海捞针
交换这些调用的第一个和第二个参数
顺便说一句,这只是一个性能提示。与其每次调用
Pos
两次,不如保留该值的缓存副本
P := Pos(';', linha);
uid := Copy(linha,1,P-1);
Delete(linha,1,P);
我通常使用
Pos(针、草垛)代码>。这样一个愚蠢的错误,这些是很难找到的。谢谢大家。更好的性能是使用Pos()
的Offset
参数,并且不删除左侧linha
内容。我通常使用Pos(针、草垛)代码>。这样一个愚蠢的错误,这些是很难找到的。谢谢大家,更好的性能是使用Pos()
的Offset
参数,并且不删除左侧的linha
内容。在这种情况下,我将使用TStringList
解析行,而不是使用Pos()
。设置TStringList.Delimiter=';'
和TStringList.StrictDelimiter=True
,然后设置TStringList.DelimitedText=linha
。或者,使用Indy的Fetch()
或SplitDelimitedString()
函数(因为问题被标记为“Indy”)。仅供参考,“第一行有一个wierd$FEFF”意味着文本前面有一个UTF-16 BOM表,这对于Web服务器来说有点奇怪,而不是依赖HTTP内容类型
头来携带字符集信息。@Remy我想这取决于需要解析多少项。在这里,似乎每次都会有4个,所以我认为在所有意义上都是安全的,更快的手动解析它。但是,如果有很多(比如20+),或者数量可变(未知),那么肯定是的,一个TStringList
会非常有效。但是对于4个值,我认为TStringList
对于这项任务来说有点太重了。@Jerrydoge:在使用Pos()
之前,我会选择使用TStringList
来解析行,而不是使用Pos()
。设置TStringList.Delimiter=';'
和TStringList.StrictDelimiter=True
,然后设置TStringList.DelimitedText=linha
。或者,使用Indy的Fetch()
或SplitDelimitedString()
函数(因为问题被标记为“Indy”)。仅供参考,“第一行有一个wierd$FEFF”意味着文本前面有一个UTF-16 BOM表,这对于Web服务器来说有点奇怪,而不是依赖HTTP内容类型
头来携带字符集信息。@Remy我想这取决于需要解析多少项。在这里,似乎每次都会有4个,所以我认为在所有意义上都是安全的,更快的手动解析它。但是,如果有很多(比如20+),或者数量可变(未知),那么肯定是的,一个TStringList
会非常有效。但是对于4个值,我认为TStringList
对于这个任务来说有点太重了。@Jerrydoge:在使用Pos()
之前,我更愿意选择使用Fetch()