字符串数组相互转换,乱码的问题。 ( 积分: 100 )

  • 主题发起人 主题发起人 gotiger
  • 开始时间 开始时间
G

gotiger

Unregistered / Unconfirmed
GUEST, unregistred user!
在我写的程序中,出现了字符串和动态数组的相互转换。程序一直出现问题。后来独立出来一段一段测试,发现是字符串和数组转换问题。<br>下面是我写的俩个独立的函数,测试结果乱码,大家帮忙看下。<br><br>省略.........<br><br>type<br>&nbsp;TArrayChar=Array&nbsp;of&nbsp;Char;<br><br>var<br>&nbsp;&nbsp;Form1:&nbsp;TForm1;<br><br>implementation<br><br>{$R&nbsp;*.dfm}<br><br>function&nbsp;StrToArray(StrText:String;var&nbsp;TextArray:TArrayChar):Boolean;<br>var&nbsp;i:integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;Len:integer;<br>begin<br>&nbsp;Result:=True;<br>&nbsp;try<br>&nbsp;&nbsp;&nbsp;Len:=Length(StrText);<br>&nbsp;&nbsp;&nbsp;SetLength(TextArray,Len);<br><br>&nbsp;&nbsp;&nbsp;for&nbsp;i:=0&nbsp;to&nbsp;Len&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextArray:=StrText;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;except<br>&nbsp;&nbsp;&nbsp;&nbsp;Result:=false;<br>&nbsp;&nbsp;end;<br>end;<br><br>function&nbsp;ArrayToStr(TextArray:TArrayChar;var&nbsp;StrText:String):Boolean;<br>var&nbsp;Len:integer;<br>begin<br>&nbsp;Result:=True;<br>&nbsp;try<br>&nbsp;&nbsp;len:=Length(TextArray);<br>&nbsp;&nbsp;StrText:=copy(Strpas(@TextArray),1,Len);<br>&nbsp;except<br>&nbsp;&nbsp;Result:=false;<br>&nbsp;end;<br>end;<br><br><br>procedure&nbsp;TForm1.Button1Click(Sender:&nbsp;TObject);<br>var&nbsp;_TextArray:TArrayChar;<br>&nbsp;&nbsp;&nbsp;&nbsp;_StrText:String;<br>begin<br>&nbsp;Try<br>&nbsp;&nbsp;if&nbsp;StrToArray(Memo1.Text,_TextArray)&nbsp;then<br>&nbsp;&nbsp;&nbsp;Memo3.Lines.Add('StrToArray&nbsp;Success!!')<br>&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;Memo3.Lines.Add('StrToArray&nbsp;Success!!');<br><br>&nbsp;&nbsp;if&nbsp;ArrayToStr(_TextArray,_StrText)&nbsp;then<br>&nbsp;&nbsp;&nbsp;Memo3.Lines.Add('ArrayToStr&nbsp;Success!!')<br>&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;Memo3.Lines.Add('ArrayToStr&nbsp;Failed!!');<br><br>&nbsp;&nbsp;&nbsp;Memo2.Text:=_StrText;<br>&nbsp;except<br>&nbsp;&nbsp;&nbsp;Memo3.Lines.Add('Btn&nbsp;Error');<br>&nbsp;end;<br>end;<br><br>procedure&nbsp;TForm1.Button2Click(Sender:&nbsp;TObject);<br>begin<br>&nbsp;&nbsp;Memo1.Clear;<br>&nbsp;&nbsp;Memo2.Clear;<br>&nbsp;&nbsp;Memo3.Clear;<br>end;<br><br>end.
 
StrText:=copy(Strpas(@TextArray),1,Len);&nbsp;一句很可能有问题。<br>动态数组的存储与静态数组是不同的,具体来说在每个元素后面都跟有一个“尾巴”,上面那句没有考虑这个问题,直接拷内存肯定是乱码,你把它改成逐个复制应该就可以了。
 
还是不行,大家继续。
 
function&nbsp;StrToArray(StrText:String;var&nbsp;TextArray:TArrayChar):Boolean;<br>var&nbsp;i:integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;Len:integer;<br>begin<br>&nbsp;Result:=True;<br>&nbsp;try<br>&nbsp;&nbsp;&nbsp;Len:=Length(StrText);<br>&nbsp;&nbsp;&nbsp;SetLength(TextArray,Len);<br><br>&nbsp;&nbsp;&nbsp;for&nbsp;i:=0&nbsp;to&nbsp;Len-1&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextArray:=StrText[i+1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;except<br>&nbsp;&nbsp;&nbsp;&nbsp;Result:=false;<br>&nbsp;&nbsp;end;<br>end;
 
感谢楼上指出了我的低级错误。不过问题没解决,继续。
 
function&nbsp;StrToArray(StrText:String;var&nbsp;TextArray:TArrayChar):Boolean;<br>var<br>&nbsp;&nbsp;&nbsp;&nbsp;Len:integer;<br>begin<br>&nbsp;Result&nbsp;:=&nbsp;True;<br>&nbsp;try<br>&nbsp;&nbsp;&nbsp;Len&nbsp;:=&nbsp;Length(StrText);<br>&nbsp;&nbsp;&nbsp;SetLength(TextArray,&nbsp;Len);<br>&nbsp;&nbsp;&nbsp;Move(StrText[1],&nbsp;TextArray[0],&nbsp;Len);<br>&nbsp;&nbsp;except<br>&nbsp;&nbsp;&nbsp;&nbsp;Result&nbsp;:=&nbsp;false;<br>&nbsp;&nbsp;end;<br>end;<br><br>function&nbsp;ArrayToStr(TextArray:TArrayChar;var&nbsp;StrText:String):Boolean;<br>var<br>&nbsp;Len:integer;<br>begin<br>&nbsp;Result&nbsp;:=&nbsp;True;<br>&nbsp;try<br>&nbsp;&nbsp;len&nbsp;:=&nbsp;Length(TextArray);<br>&nbsp;&nbsp;SetLength(StrText,&nbsp;len);<br>&nbsp;&nbsp;Move(TextArray[0],&nbsp;StrText[1],&nbsp;len);<br>&nbsp;except<br>&nbsp;&nbsp;Result&nbsp;:=&nbsp;false;<br>&nbsp;end;<br>end;
 
下述函数在D6下调试通过,中英文都可以(关键问题还是我上面那句话):<br><br>function&nbsp;StrToArray(StrText:String;var&nbsp;TextArray:TArrayChar):Boolean;<br>var&nbsp;i:integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;Len:integer;<br>begin<br>&nbsp;Result:=True;<br>&nbsp;try<br>&nbsp;&nbsp;&nbsp;Len:=Length(StrText);<br>&nbsp;&nbsp;&nbsp;SetLength(TextArray,Len);<br><br>&nbsp;&nbsp;&nbsp;for&nbsp;i:=0&nbsp;to&nbsp;Len-1&nbsp;do<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TextArray:=StrText[i+1];<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;end;<br>&nbsp;&nbsp;except<br>&nbsp;&nbsp;&nbsp;&nbsp;Result:=false;<br>&nbsp;&nbsp;end;<br>end;<br><br>function&nbsp;ArrayToStr(TextArray:TArrayChar;var&nbsp;StrText:String):Boolean;<br>var<br>&nbsp;Len:integer;<br>&nbsp;i:integer;<br>begin<br>&nbsp;Result:=True;<br>&nbsp;try<br>&nbsp;&nbsp;len:=Length(TextArray);<br>&nbsp;&nbsp;setlength(StrText,len);&nbsp;//重点!<br>&nbsp;&nbsp;for&nbsp;i:=0&nbsp;to&nbsp;len-1&nbsp;do<br>&nbsp;&nbsp;&nbsp;StrText[i+1]:=TextArray;//重点!<br>&nbsp;except<br>&nbsp;&nbsp;Result:=false;<br>&nbsp;end;<br>end;
 
好像是TEXTSTRING:STRING索引是从1开始,而数组是从0开始的,能达到你想要的结果吗?
 
Miros:&nbsp;满分!
 
string&nbsp;是基于1<br>动态数组是基于0的<br>预先分配好空间<br>剩下就是内存操作了
 
最简单的:<br>function&nbsp;StrToArray(StrText:String;var&nbsp;TextArray:TArrayChar):Boolean;<br>var&nbsp;i:integer;<br>&nbsp;&nbsp;&nbsp;&nbsp;Len:integer;<br>begin<br>&nbsp;Result:=True;<br>&nbsp;try<br>&nbsp;&nbsp;&nbsp;Len:=Length(StrText);<br>&nbsp;&nbsp;&nbsp;SetLength(TextArray,Len);<br>&nbsp;&nbsp;&nbsp;Move(StrText[1],&nbsp;TextArray[0],&nbsp;Len);<br>&nbsp;&nbsp;except<br>&nbsp;&nbsp;&nbsp;&nbsp;Result:=false;<br>&nbsp;&nbsp;end;<br>end;
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
582
import
I
后退
顶部