【较难!】 一个字符串处理函数!(100分)

  • 主题发起人 主题发起人 m911
  • 开始时间 开始时间
M

m911

Unregistered / Unconfirmed
GUEST, unregistred user!
function S2Int( S: PChar ): Integer;<br>var M : Integer;<br>begin<br>&nbsp; &nbsp;Result := 0;<br>&nbsp; &nbsp;if S = '' then Exit;<br>&nbsp; &nbsp;M := 1;<br>&nbsp; &nbsp;if S^ = '-' then<br>&nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp; M := -1;<br>&nbsp; &nbsp; &nbsp; Inc( S );<br>&nbsp; &nbsp;end<br>&nbsp; &nbsp; &nbsp;else<br>&nbsp; &nbsp;if S^ = '+' then<br>&nbsp; &nbsp; &nbsp;Inc( S );<br>&nbsp; &nbsp;while S^ in [ '0'..'9' ] do<br>&nbsp; &nbsp;begin<br>&nbsp; &nbsp; &nbsp; Result := Result * 10 + Integer( S^ ) - Integer( '0' );<br>&nbsp; &nbsp; &nbsp; Inc( S );<br>&nbsp; &nbsp;end;<br>&nbsp; &nbsp;if M &lt; 0 then<br>&nbsp; &nbsp; &nbsp; Result := -Result;<br>end;<br><br>function StrToInt(const Value: string) :Integer;<br>begin<br>&nbsp; Result := S2Int( PChar( Value ) );<br>end;<br><br>上面我在网上找到的StrToInt函数,不知道为什么,这个函数计算StrToInt('$'+s[j*2-1]+s[j*2] );得出的结果和SysUtils单元中的StrToInt函数得出的结果会不一样呢? &nbsp;谁能帮我弄个和SysUtils单元中StrToInt结果一样的函数啊?(前提是根本不调用SysUtils单元)
 
Function StrToInt(s:String):Integer;<br>var i,j,h,n:Integer;<br>begin<br>&nbsp; Result := 0;<br>&nbsp; if s = '' then<br>&nbsp; &nbsp; Exit;<br>&nbsp; i := 1;<br>&nbsp; if s = '-' then<br>&nbsp; begin<br>&nbsp; &nbsp; n := -1;<br>&nbsp; &nbsp; inc(i);<br>&nbsp; end<br>&nbsp; else if s = '+' then<br>&nbsp; &nbsp; inc(i);<br>&nbsp; if s = '$' then<br>&nbsp; begin<br>&nbsp; &nbsp; inc(i);<br>&nbsp; &nbsp; h := 16;<br>&nbsp; end<br>&nbsp; else<br>&nbsp; &nbsp; h := 10;<br>&nbsp; while i &lt;= Length(s) do<br>&nbsp; begin<br>&nbsp; &nbsp; if s in ['0'..'9'] then<br>&nbsp; &nbsp; &nbsp; j := Ord('0')<br>&nbsp; &nbsp; else if (s in ['A'..'Z']) and (h &gt; 10) then<br>&nbsp; &nbsp; &nbsp; j := Ord('A') - 10<br>&nbsp; &nbsp; else if (s in ['a'..'z']) and (h &gt; 10) then<br>&nbsp; &nbsp; &nbsp; j := Ord('a') - 10<br>&nbsp; &nbsp; else<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; Result := 0;<br>&nbsp; &nbsp; &nbsp; MessageBox(0,pChar(''''+ s + '''' + '不是一个有效的整数'),nil,MB_OK);<br>&nbsp; &nbsp; &nbsp; Exit;<br>&nbsp; &nbsp; end;<br>&nbsp; &nbsp; Result := Result * h + Ord(s) - j;<br>&nbsp; &nbsp; inc(i);<br>&nbsp; end;<br>&nbsp; if n &lt; 0 then<br>&nbsp; &nbsp; Result := -Result;<br>end;
 
刚才看了一下SysUtils单元的StrToInt的实现方法才发现,原来我们都在舍近求远的使用代码。唉!!![xx(][xx(][xx(]<br>SysUtils Units<br>function StrToInt(const S: string): Integer;<br>var<br>&nbsp; E: Integer;<br>begin<br>&nbsp; Val(S, Result, E); // 这里调用的是system单元的Val过程,既然可以在SysUtils单元中调用,自然也可以在我们自己的单元中使用。<br>&nbsp; if E &lt;&gt; 0 then ConvertErrorFmt(@SInvalidInteger, );<br>end;<br>// 所以,前面的代码只须改成这样就可以不用使用SysUtils单元了。<br>Function StrToInt(const s:String):Integer;<br>var e:Integer;<br>begin<br>&nbsp; Val(s,Result,e);<br>&nbsp; if e &lt;&gt; 0 then<br>&nbsp; &nbsp; MessageBox(0',pChar(''''+s+''''+'不是一个有效的整数!'),nil,MB_OK);<br>end;
 
不用 SysUtils?楼主很有意思。<br>1、如果是不用 Forms.pas 的程序,不调用 SysUtils.pas 也许会减少点程序大小;<br>2、如果各单元中任何一个单元调用了 SysUtils.pas,跟各每个单元都调用 SysUtils.pas 没有任何区别;<br>3、退一万步说,如果楼主真的不想用 SysUtils.pas,那干嘛不把 SysUtils.pas 中的 StrToInt 及其相关函数拷贝粘贴到您的程序里涅?那不就达到效果了么?
 
to vvyang, <br><br>1. 问题一 你解释的完全正确<br>2. 有其他单元调用了SysUtils 我还会来这发问吗?<br>3. 就算退两万步 &nbsp;我也没把SysUtils单元中的StrToInt 及其相关函彻底分离出来<br><br>总结 这位老兄不是来解决麻烦的,而是来添加麻烦的
 
不知道你“StrToInt('$'+s[j*2-1]+s[j*2] );”中的 s,j是指什么?
 
提醒注意的是你的代码仅支持10进制,不支持16进制。
 
高手来了! &nbsp;大侠 请问我如果想支持16进制和10进制的话 应该怎么改这个函数呢 &nbsp;谢谢!
 
我在一楼和二楼不是给你答案了吗?
 
Function StrToInt(s:String):Integer;<br>var i,j,h,n:Integer;<br>begin<br>&nbsp; Result := 0;<br>&nbsp; if s = '' then<br>&nbsp; &nbsp; Exit;<br>&nbsp; i := 1;<br>&nbsp; if s = '-' then<br>&nbsp; begin<br>&nbsp; &nbsp; n := -1;<br>&nbsp; &nbsp; inc(i);<br>&nbsp; end<br>&nbsp; else if s = '+' then<br>&nbsp; &nbsp; inc(i);<br>&nbsp; if s = '$' then<br>&nbsp; begin<br>&nbsp; &nbsp; inc(i);<br>&nbsp; &nbsp; h := 16;<br>&nbsp; end<br>&nbsp; else<br>&nbsp; &nbsp; h := 10;<br>&nbsp; while i &lt;= Length(s) do<br>&nbsp; begin<br>&nbsp; &nbsp; if s in ['0'..'9'] then<br>&nbsp; &nbsp; &nbsp; j := Ord('0')<br>&nbsp; &nbsp; else if (s in ['A'..'Z']) and (h &gt; 10) then<br>&nbsp; &nbsp; &nbsp; j := Ord('A') - 10<br>&nbsp; &nbsp; else if (s in ['a'..'z']) and (h &gt; 10) then<br>&nbsp; &nbsp; &nbsp; j := Ord('a') - 10<br>&nbsp; &nbsp; else<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; Result := 0;<br>&nbsp; &nbsp; &nbsp; MessageBox(0,pChar(''''+ s + '''' + '不是一个有效的整数'),nil,MB_OK);<br>&nbsp; &nbsp; &nbsp; Exit;<br>&nbsp; &nbsp; end;<br>&nbsp; &nbsp; Result := Result * h + Ord(s) - j;<br>&nbsp; &nbsp; inc(i);<br>&nbsp; end;<br>&nbsp; if n &lt; 0 then<br>&nbsp; &nbsp; Result := -Result;<br>end;<br><br>或者<br>Function StrToInt(const s:String):Integer;<br>var e:Integer;<br>begin<br>&nbsp; Val(s,Result,e); // SysUtils单元的StrToInt也是用了这个函数,这个函数是system单元中的,不是SysUtils单元的,就算你的程序不包含SysUtils单元,这个函数也是Delphi默认包含的。所以可以在你的程序中直接使用。<br>&nbsp; if e &lt;&gt; 0 then<br>&nbsp; &nbsp; MessageBox(0',pChar(''''+s+''''+'不是一个有效的整数!'),nil,MB_OK);<br>end;
 
朋友 这个我试过了 不好用的啊 &nbsp;你也可以试试啊<br><br>Function StrToInt(const s:String):Integer;<br>var e:Integer;<br>begin<br>&nbsp; Val(s,Result,e); // SysUtils单元的StrToInt也是用了这个函数,这个函数是system单元中的,不是SysUtils单元的,就算你的程序不包含SysUtils单元,这个函数也是Delphi默认包含的。所以可以在你的程序中直接使用。<br>&nbsp; if e &lt;&gt; 0 then<br>&nbsp; &nbsp; MessageBox(0',pChar(''''+s+''''+'不是一个有效的整数!'),nil,MB_OK);<br>end;
 
第一个方法我是修改自你给你的代码,第二方法是将SysUtils单元中抽取出来的代码,你的意思是说SysUtils单元的SrtToInt函数不好用?
 
哈哈 是我搞错了啊!!! 谢谢大侠! 给分!
 
后退
顶部