程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> Delphi >> 兩個字符串分割函數引出的奇怪問題

兩個字符串分割函數引出的奇怪問題

編輯:Delphi
下面兩個函數均是對於一個字符串將其以某個分割符分開:
  
    function SplitStrToArray(const tString, tSplit: String): TStringList;  
       //以後成為方法1,這也是《Delphi超級猛料》中提到的算法
    var
      t_Str, t_Item: WideString;
      t_Index, t_Len: Integer;
      t_StrList: TStringList;
    begin
      t_StrList := TStringList.Create();
      t_Str := tString;
      t_Len := Length(tString);
      t_Index := pos(tSplit, t_Str);  //語句1
      if t_Index > 0 then
      begin
        while t_Index > 0 do
        begin
          t_Item := LeftStr(t_Str, t_Index - 1);
          t_Str := MidStr(t_Str, t_Index + 1, t_Len);
          t_Index := Pos(tSplit, t_Str);
          if Length(t_Item) > 0 then
            t_StrList.Add(t_Item);
        end;
      end;
      if Length(t_Str) > 0 then
        t_StrList.Add(t_Str);
      Result := t_StrList;
    end;
  
    function SplitString(const source,ch:string):TStringList;
  //以後成為方法2;
    var
      temp:string;
      i:integer;
      begin
        result:=tstringlist.Create;
        temp:=source;
        i:=pos(ch,source);
        while i<>0 do
          begin
          result.Add(copy(temp,0,i-1));
          delete(temp,1,i);
          i:=pos(ch,temp);
          end;
      result.Add(temp);
    end;
  
  看上去兩段代碼都沒有問題,然而,實際用這兩段進行測試時:比如:
    s:='美國a,aab,中國,ddf';
    t:=SplitStrToArray(s,',');
  //t:=SplitString(s,',');
    for i:=0 to t.Count-1 do
      showmessage(t.Strings[i]);
  
      會發現方法1不能識別中文,也就是說在有中文的字符串裡面,方法一不能正確分割。而方法2可以。問題出現在哪裡呢?
      我又跟蹤程序發現,兩個函數在進入循環之前都執行了一個pos( )函數,而方法1此時返回的值是4,方法2返回的就是6,所以方法1自然不能正確識別了。那麼問題又來了,在他們的pos之前,兩個函數都沒有做什麼奇怪的操作啊。
      再嘗試,將方法1的 語句1,即t_Index := pos(tSplit, t_Str);的pos的第二個參數修改為函數的形參tString,那麼,此句t_Index的值就是正確的6,而以後的分割又錯了。
      我實在是想不通了,不知道哪位達人遇到過類似的問題,還是說我分析的不對,還是Delphi的bug?
  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved