strpbrk 函式解析

2021-06-13 22:21:21 字數 1774 閱讀 9987

一、           strpbrk (string pointer break)

//

// 函 數: char * strpbrk(const char * string,const char * control)

// 功 能: 檢查字串string和control中第乙個相同的字元

// 參 數:

// 返 回: 返回字串string和control中第乙個相同的字元後面的string字串

//char * strpbrk(const char * string,const char * control)

while ( *str )

str++;

}return(null);}

//// 例:string = "129th";

// control = "b295";

//

仔細體會下上面的**,不禁暗暗叫絕。 1、

首先定義個大小為32個字元的map,為什麼要這麼劃一道呢?因為在ascii錶能表示128個字元,而擴充套件後的ascii卻能表示256個字元,乙個字元是8位,32 x 8 = 256,即:在這個map裡,每個字元的8各位可以表示8個字元。 2、

把map初始化後,便開始設定每個控制字元的map,這裡可以提出個問題:為什麼取3和7作為運算元?原因在這兒:左移3位即是除以8(*ctrl >> 3),表示陣列的下標,map陣列的每個下標才能對應8個目標,這樣才能構造出容納256個字元的能力,比如:map[0]可以表示出0~7的字元,map[1]可以表示出8~15的字元,… map[6]就能表示出48~55的字元(即字元』0』~』7』)。如圖1-1所示:

圖1-1 字元map構造

把字串control = "b295";

構造進map,首先字元』b』,二進位制為:0110 0010,右移3位(除以8):0000 1100,即十進位制數:12;也就是map[32]的下標12確定了,也就是表面字元』b』 在map裡的位置是第12位。

(0x01 << (*ctrl & 7)

:b & 7後的結果為:0000 0010,十進位制2;0x01左移2位(即1乘以4),結果為:0000 0100,十進位制為4;

最後用map[12]的初始值0 與上面的結果做位邏輯或賦值,得到

map[12] = 4

即0000 0100

,見上圖

1-1所示,下標為

12的時候,從低位數到第三個資料是

1,而對應的十進位制數中第三個數字

98正是字元

』b』。

依此計行之,挨個把字元構造進了

map。

3、剩下的就是查詢了,思路就是:把該字元依照上面的方法定位該字元在

map裡的對應下標,然後把該字串與

map裡對應下標的值進行判斷。

先把字元

』1』 & 7,

結果如圖

1-2所示:

圖1-2 查詢邏輯

把最後的結果(0000 0010)與map[12]中的(0000 0100)做按位與計算的(0000 0000),顯然不是需要的結果,果斷str++ ;

輪到字元』2』了,衝入上面的操作後,得到的結果(0000 0100),再與map[12]按位與,得到結果(0000 0100),返回剩下的字串。

C語言字串函式 strpbrk函式

一,strpbrk函式 函式原型 extern char strpbrk char s1,char s2 標頭檔案 功能 在字串s1中尋找字串s2中任何乙個字元相匹配的第乙個字元的位置,但s2中不能包含 0 這個函式可以認為是strchr的乙個擴充套件版本。其它 這個函式名字不如strcpy str...

詳解C語言中strpbrk 函式的用法

標頭檔案 include strpbrk 函式檢索兩個字串中首個相同字元的位置,其原型為 char strpbrk char s1,char s2 引數說明 s1 s2要檢索的兩個字串。strpbrk 從s1的第乙個字元向後檢索,直到 0 如果當前字元存在於s2中,那麼返回當前字元的位址,並停止檢索...

linux wait函式解析

程序一旦呼叫了wait,就立即阻塞自己,由wait自動分析是否當前程序的某個子程序已經退出,如果讓它找到了這樣乙個已經變成殭屍的子程序,wait 就會收集這個子程序的資訊,並把它徹底銷毀後返回 如果沒有找到這樣乙個子程序,wait就會一直阻塞在這裡,直到有乙個出現為止。wait 等待子程序中斷或結束...