2009-02-01 119 views
24

我在C中使用低級別的字符串工作時偶爾會使用strpbrk(),但我從來沒有弄清楚它代表什麼。在我的腦海裏,我總是把它說成是「攪拌吠叫」,但那從來沒有感覺到過。strpbrk代表什麼?

它沒有像任何其他字符串函數一樣明顯的詞源,例如, strchrSTR荷蘭國際集團CH一個- [R ACTER)或strspnSTR荷蘭國際集團SP一個Ñ)。

我依稀記得在某處讀取的所有原始標準庫函數都限制爲7個字符的名稱,以便與Fortran保持兼容,或者因爲在原始C標準中,超過7個字符的標識符被認爲與它們的7字符前綴或什麼的。任何人都可以確認/否認/澄清這一點?

+0

即將提出類似的問題,然後我在這裏找到答案。你的「攪拌皮吠聲」似乎頗具創意;) – artm 2015-12-20 22:09:57

+1

我總是發音爲「strip [bork](https://en.wikipedia.org/wiki/Swedish_Chef)」。對我有任何其他解釋的意義:) – Lundin 2016-01-08 15:02:00

回答

25

下面的談話表明「字符串的指針歇」: http://www.cpptalk.net/what-strspn-and-strpbrk-stands-for--vt1253.html

事實上,微軟的文檔的情況是StrPBrk並傾向於證實話的那一剎那: http://msdn.microsoft.com/en-us/library/bb760010(VS.85).aspx

最後這證實了這一點: http://www.gnu.org/software/libtool/manual/libc/Search-Functions.html

strpbrk(「字符串指針中斷」)函數與strcspn相關,除了它是r可以控制一個指向字符串中第一個字符的指針,該字符串是set stopset的成員,而不是初始子字符串的長度。如果找不到來自stopset的這樣的字符,它將返回一個空指針。

+7

哇 - 打破指針聽起來痛苦 – bobobobo 2009-07-19 14:54:33

3

我vageuly記得,strpbrk代表字符串指針中斷,我不記得我在哪裏看到它。

12

From The GNU C Library documentation

Function:字符* strpbrk(常量字符 *串,常量字符* stopset)

功能相關的strpbrk( 「字符串指針斷裂」),以strcspn ,除了 它返回一個指向字符串中的第一個 字符的指針,該字符是初始子字符串的集合停止集的成員 而不是 的長度。如果找不到來自stopset的這樣的 字符,則它 返回空指針。

例如,

strpbrk( 「你好,世界」, 「\噸\ N,;!?」) => 「世界」

該函數返回一個指針,指向STOPSET中的第一個字符(aka BREAKSET)。我在心裏讀爲「for STR ing,return P ointer BR ea K」。

7

至於你的其他問題:

我依稀記得讀書的地方 所有的原標準 庫函數僅限於 7個字符的名稱要麼留 與Fortran語言兼容,或者因爲在原始C標準 ,長度超過7個字符的標識符 分別爲 等同於它們的 7個字符的前綴或其他。 有人可以確認/否認/澄清?

最初的ANSI C標準說它是實現定義了外部符號有多少個字符是重要的,但它必須至少有6個字符(並且實現可以對它們不敏感)。這是因爲系統經常出現這種類型的限制(無論它來自FORTRAN庫,鏈接器限制還是其他)。

因此,雖然您會看到外部名稱長於標準庫中的外部名稱,但這些名稱中沒有兩個以相同的6個字符序列開頭。

FWIW,C99撞到最多31個字符。 C++標準(1998)指出,實現必須記錄多少外部名稱是重要的,並且表明它至少有1024個字符。我知道Borland C++ 5.5有250個字符的限制,特別是在使用模板時會導致問題。

2

1972年在貝爾實驗室還有一種名爲Snobol的編程語言,它是用於字符串操作的。它有函數break()和span(),它們做了基本相同的事情。大部分字符串函數都是在Snobol中出現的東西之後建模的。查看James F. Gimpel博士寫的簡歷和書籍

0

儘管每個人都只是引用了他們的內容,但他們並沒有解釋爲什麼它是「STRing Pointer BReaK」。您可以輕鬆地記住它,並理解爲什麼strpbrk在您考慮如下底層算法時可能會出現:

掃描STRING BREAK時,如果找到POINTER上的任何字符。