delphi 字符串處理中的怪異現(xiàn)象與處理方式
1, 怪異現(xiàn)象:字符串相加操作不正常!

以上代碼,明顯輸出字符串應(yīng)含有后綴“.jpg”,但實(shí)際輸出卻不含后綴(如下),字符串加法操作似乎不起作用了!

采用showMessage進(jìn)行輸出,看看結(jié)果如何?

結(jié)果仍是不顯示字符串后綴,但可以看到字符串偏左顯示,似乎后面還有很多不可見字符。
2,怪異原因:字符串中含有\(zhòng)0,即字符串終止符
以上現(xiàn)象已經(jīng)看出,字符串加法失效的原因可能是含有某些不可見字符,那到底是什么字符呢?
回到這些字符串產(chǎn)生的源頭,即下面由字節(jié)數(shù)組轉(zhuǎn)換成字符串函數(shù):

顯然,此函數(shù)未考慮len長(zhǎng)度以內(nèi)可能含有的\0字符,如果buffer中l(wèi)en長(zhǎng)度以內(nèi)含有\(zhòng)0字符,那么這些\0字符也會(huì)被復(fù)制進(jìn)result字符串中,造成后續(xù)字符串加法“失效”。
3,解決方案:修改函數(shù)
將函數(shù)修改如下,判斷逐字節(jié)判斷buffer,遇到\0就返回,這樣轉(zhuǎn)換的字符串就不含\0了。問題解決。
//字節(jié)轉(zhuǎn)換為字符串 $D4 $C1--> '粵' function BytesToString(buffer: Array of byte; offset:integer; len: integer): string; var str: string; i : Integer; begin SetLength(str, len); for i:=0 to len-1 do begin if buffer[offset-1+i]=0 then break; //遇到ASCII 0不再?gòu)?fù)制! Move(buffer[offset-1+i], str[1+i], 1);//注意,這里是從str[1]開始復(fù)制的 end; //Move(buffer[offset-1], str[1], len);//注意,這里是從str[1]開始復(fù)制的 //ShowMessage (str); SetLength(str, i); result := str; end;
以上這篇delphi 字符串處理中的怪異現(xiàn)象與處理方式就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
TImage組件實(shí)現(xiàn)保存圖片到Stream
這篇文章主要介紹了TImage組件實(shí)現(xiàn)保存圖片到Stream以及從stream中讀取圖片的方法,非常的實(shí)用,有需要的小伙伴可以參考下2016-05-05
Delphi實(shí)現(xiàn)圖片滾動(dòng)切換的完整實(shí)例代碼
這篇文章主要介紹了Delphi實(shí)現(xiàn)圖片滾動(dòng)切換的完整實(shí)例代碼,通過本實(shí)例,讀者可以進(jìn)一步掌握Delphi控件及圖形處理的技巧,需要的朋友可以參考下2014-07-07
Windows API GetLastError()函數(shù)返回值含義解釋
這篇文章主要介紹了Windows API GetLastError()函數(shù)返回值含義解釋,本文羅列了所有錯(cuò)誤代碼及中文注釋,需要的朋友可以參考下2015-05-05
Delphi實(shí)現(xiàn)碰撞球體完整實(shí)例代碼
這篇文章主要介紹了Delphi實(shí)現(xiàn)碰撞球體完整實(shí)例代碼,通過該實(shí)例,讀者可以完整的了解一個(gè)Delphi項(xiàng)目的創(chuàng)建過程,加深對(duì)Delphi運(yùn)行原理的了解,需要的朋友可以參考下2014-07-07

