全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:5423
推到 Plurk!
推到 Facebook!

不要误解了Trim函数

 
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-10 09:22:06 IP:218.1.xxx.xxx 未訂閱
我一直以为Trim函数的功能是把字串的头尾"空格"去掉,但最近程序出了个非常怪的bug,最后好不容易才发现是对Trim函数的误解,看看它的原码:
function Trim(const S: string): string;
var
  I, L: Integer;
begin
  L := Length(S);
  I := 1;
  while (I <= L) and (S[I] <= ' ') do Inc(I);
  if I > L then Result := '' else
  begin
    while S[L] <= ' ' do Dec(L);
    Result := Copy(S, I, L - I + 1);
  end;
end;
看到了吗?它用了"<=",就是说不是光去掉"空格",小于"空格"的ASCII码都去掉了! 我原来的资料里末尾有回车/换行(#13#10)符,结果也被去掉了,因此引起了奇怪的bug 久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听 發表人 - mustapha.wang 於 2003/07/10 13:47:59
------
江上何人初见月,江月何年初照人
Royce520
高階會員


發表:18
回覆:157
積分:100
註冊:2002-09-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-10 21:49:43 IP:140.126.xxx.xxx 未訂閱
mustapha.wang 你好,   謝謝你將 trim 的程式碼找出來, 並提醒了大家,   我補充一點, trim 的函數功能原來就是定義為: Trims leading and trailing spaces and control characters from a string.      所以, 它會濾掉空白與控制字元...   剛好, 0x20(即空白)之前 皆為控制字元.    *真實的事物最美, 簡單的道理最好, 我能體會的 太少*
------
不要忘記呼吸,不要忘記編程! ∩__∩
ctx62
一般會員


發表:4
回覆:28
積分:6
註冊:2002-12-12

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-11 09:11:50 IP:61.182.xxx.xxx 未訂閱
在編程時多看看delphi自帶的幫助文件,可以少犯錯誤,節省時間
kant
一般會員


發表:18
回覆:32
積分:10
註冊:2002-06-08

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-12 13:56:41 IP:218.163.xxx.xxx 未訂閱
疑~~~ 你沒講我都還沒有發現這個問題耶! 長久以來, 我只想到用 Trim 來抓所要的字串而已. 從沒想過還要抓換行碼. 如果要的話, 我都是自行再加上 CHR(13) CHR(10) 到目標內 經你這麼一提, 我對 Delphi 的認識就更深了. 由其是找程式碼來分析這部份, 謝謝你. Kant
------
Kant
Dot.com
一般會員


發表:19
回覆:18
積分:7
註冊:2003-07-03

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-12 15:53:26 IP:218.15.xxx.xxx 未訂閱
我常用的一个函数: StringReplace(str,' ','',[rfReplaceAll]) 替换 str 字串中所有的' '(空格) 为 ''(空字串)。
ry_lee
高階會員


發表:368
回覆:251
積分:123
註冊:2002-03-19

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-12 23:39:41 IP:203.70.xxx.xxx 未訂閱
請問你是如何看到trim函數之原始碼?    
引言: 我一直以为Trim函数的功能是把字串的头尾"空格"去掉,但最近程序出了个非常怪的bug,最后好不容易才发现是对Trim函数的误解,看看它的原码:
function Trim(const S: string): string;
var
  I, L: Integer;
begin
  L := Length(S);
  I := 1;
  while (I <= L) and (S[I] <= ' ') do Inc(I);
  if I > L then Result := '' else
  begin
    while S[L] <= ' ' do Dec(L);
    Result := Copy(S, I, L - I + 1);
  end;
end;
看到了吗?它用了"<=",就是说不是光去掉"空格",小于"空格"的ASCII码都去掉了! 我原来的资料里末尾有回车/换行(#13#10)符,结果也被去掉了,因此引起了奇怪的bug 久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听 發表人 - mustapha.wang 於 2003/07/10 13:47:59
mustapha.wang
資深會員


發表:89
回覆:409
積分:274
註冊:2002-03-13

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-14 09:36:41 IP:218.1.xxx.xxx 未訂閱
引言: 請問你是如何看到trim函數之原始碼?
基本的操作了,看看相关资料,赘述如此: 选择菜单Tools->Environment Options,如果Library页的Broowsing path里有原码路径,如../source/rtl/sys/SysUtils.pas (1).按住Ctrl,移动鼠标到Trim函数时,鼠标所在的Symbol会变色并加下划线,点击,会找到../Source/rtl/sys/SysUtils.pas里的Trim函数原码 (2).右键点击Trim字串,选取Find declaration同样可以找到原码 久病成良医--多试 千人之诺诺,不如一士之谔谔--兼听 發表人 - mustapha.wang 於 2003/07/14 09:39:08
------
江上何人初见月,江月何年初照人
系統時間:2024-07-03 2:29:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!