字串
在c語言中,字串是由字元組成,單字元不是字串,至少有兩個字元組成,且結尾字元是'/0'。
例如:"abcd" 記憶體中實際儲存結構是 41h 42h 43h 44h 00h
字串的定址,依靠首位元組進行暫存器相對定址方式:
例如:訪問"abcd"中的第二位元組,byte ptr [ebx+1]
正是因為字串的首位元組索引的定址方式,因此字串往往要與指標配合。在c語言中常見的,
例如:char *str=「abcd」;//mov [***x],offset string "abcd"
另一種常見的方式,是將字串放在陣列裡,需要首位元組位址時,在陣列名前加"&"偽裝成指標。當然,存在陣列裡的字串,自然可以按照陣列的訪問方式,比如 直接定址。
陣列
陣列其實和普通變數沒什麼區別,每乙個成員都是分別通過直接定址方式訪問。
但只有一種情況例外,並且十分常見,即當索引號為變數時,使用相對定址方式。
例如:char a[4]=;
for(int i=0;i<3;i++)
a[i]+=1;
對應反彙編:
char a[4]=;
0041139e mov byte ptr [a],41h
004113a2 mov byte ptr [ebp-7],41h
004113a6 mov byte ptr [ebp-6],41h
004113aa mov byte ptr [ebp-5],0
for(int i=0;i<3;i++)
004113ae mov dword ptr [i],0
004113b5 jmp wmain+40h (4113c0h)
004113b7 mov eax,dword ptr [i]
004113ba add eax,1
004113bd mov dword ptr [i],eax
004113c0 cmp dword ptr [i],3
004113c4 jge wmain+5ah (4113dah)
a[i]+=1;
004113c6 mov eax,dword ptr [i]
004113c9 movsx ecx,byte ptr a[eax]
004113ce add ecx,1
004113d1 mov edx,dword ptr [i]
004113d4 mov byte ptr [a+edx],cl
;反彙編器上常寫為mov byte ptr a[edx],cl
004113d8 jmp wmain+37h (4113b7h)
陣列的尷尬
除了原始碼除錯,由於陣列不標記邊界,提通過資料初始化不能判斷陣列的始末位置
比如:int i=0;
int a[3]=;
od反彙編結果:
00412ffe mov dword ptr ss:[ebp-8], 0
00413005 mov dword ptr ss:[ebp-1c], 1
0041300c mov dword ptr ss:[ebp-18], 2
00413013 mov dword ptr ss:[ebp-14], 3
顯然,只看初始化我們很容易錯誤還原為 int a[4]=;
因此陣列的邊界判斷,需要後續**流程的輔助,因為陣列通常都是同一類操作的集合。
字元識別(字串處理)
描述 中南林業科技大學計算機與資訊工程學院某位老師開發乙個字元識別程式.這個程式用來將紙質文件轉換為電子版.很顯然,這個轉換過程不能保證100 正確,其中有些字元不能識別.你的任務是寫乙個程式幫助這位老師計算識別的效率.識別的效率用公式r a進行計算,其中r表示被成功識別的字元總數,a表示識別的字元...
識別字串 Python3
識別字串 是 lintcode 詳見 lintcode介紹 所提供的一道 簡單 級別的面試題,現在我對python3的實現做以簡單分析,如有不妥之處,歡迎指正。給定一組n個僅包含小寫字母的字串,為每個字串找出能夠唯一識別該字串的最小字首 即可以識別a串的最小字首ap,不會是其他n 1個字串的字首。1...
正規表示式識別字串中的URL
一般我們經常看到一些在帖子或者別人的文章裡,文字中間還會夾帶著很多的 還有url而且url還是可以點選進去的 還有另外乙個較常用到的地方就是聊天系統中識別對話的url,廢話不多說,入正題請看下面的 從字串中提取url function matchurl str else return res res...