国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

strspn

2019-11-06 06:37:07
字體:
來源:轉載
供稿:網友

strspn

C99描述

#include <string.h>size_t strspn(const char *s1, const char *s2);

The strspn function computes the length of the maximum initial segment of the string pointed to by s1 which consists entirely of characters from the string pointed to by s2. 函數的參數s2指向的字符串組成了一個接受字符集,注意不包含字符串結束標志’/0’,這個字符比較特殊。s2中字符的重復出現并不影響函數的返回值。 函數完成的功能是根據接受字符集對s1指向的字符串從頭開始匹配,直到發現一個不在接受字符集中的字符(或是到達字符串的結尾,這也意味著匹配結束),然后返回匹配字符的數量。

在查看C99標準的這段英文描述時,要注意一個詞匯”the string pointed to by s1”中的”string”,指針指向的數據一般由三種情況: - string - array - object 這三個詞匯代表的含義略有不同。string一定是字符串,以’/0’結尾;array可能是字符串,也可能是普通的內存塊,在函數實現中,如果遇到了’/0’,那么要將它當成字符串,知道目前已經到了結尾了;而object則看做內存塊,實現中不會根據值為0的字節而武斷的認為到了結尾。 例如:

void *memchr(const void *s, int c, size_t n);/* ... the object pointed to by s ... */int strncmp(const char *s1, const char *s2, size_t n);/* ... the array pointed to by s1 ... */

可見C標準的措辭嚴謹。 掌握這些措辭的細節,對理解函數的實現和使用是有幫助的。

musl C中實現

#include <string.h>#define BITOP(a,b,op) / ((a)[(size_t)(b)/(8*sizeof *(a))] op (size_t)1<<((size_t)(b)%(8*sizeof *(a))))size_t strspn(const char *s, const char *c){ const char *a = s; size_t byteset[32/sizeof(size_t)] = { 0 }; if (!c[0]) return 0; if (!c[1]) { for (; *s == *c; s++); return s-a; } for (; *c && BITOP(byteset, *(unsigned char *)c, |=); c++); for (; *s && BITOP(byteset, *(unsigned char *)s, &); s++); return s-a;}

這段代碼的難點在于BITOP宏的理解。 byteset數組大小為32個字節,32*8=256個位,我們知道char類型數據的長度是8位,最多有256個不同的char數據,而byteset恰是256位,每個位對應了一個char類型的字符,看到這你有可能猜到了函數的主體是如何實現的。 第一個for循環,根據s2指向的字串統計接受字符集。 試舉一例,通過查ascii碼我們知道 01100001 97 a 如果遇到了’a’,那么BITOP(…)操作的效果是byteset的第(97-1)位設置為1。這代表’a’是可接受字符。 第二個for循環是從頭開始匹配s1中的每個字符。發生不匹配時立刻停止。 使用bitmap可以極大的節約存儲空間,其中的位操作乍看之下讓人眼花繚亂,但是讀懂之后想要重構的更簡單,貌似也沒有更好的辦法,讀懂之后也跟作者一樣連注釋也懶得添加。這種算法比嵌套的兩層循環要節約很多時間,值得花些時間來理解(走過,路過,不要錯過)。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 新乐市| 庐江县| 太和县| 达拉特旗| 绥滨县| 建湖县| 阳信县| 武宁县| 靖边县| 千阳县| 东台市| 黄浦区| 湟中县| 清涧县| 佛教| 卢湾区| 竹北市| 洪雅县| 磐安县| 邻水| 无锡市| 伊吾县| 六盘水市| 东明县| 兴文县| 通海县| 区。| 岱山县| 隆安县| 吕梁市| 郸城县| 清丰县| 合山市| 双流县| 苍山县| 肃南| 玉林市| 五华县| 肇东市| 临颍县| 永嘉县|