2014-06-28 84 views
10

作爲其他C庫函數,如strcpy,strcat,有一個版本限制字符串的大小(strncpy等),我想知道爲什麼沒有這樣的變體strchr爲什麼沒有strnchr功能?

+3

爲什麼你需要它? 'memchr()'不能做'strnchr()'會做什麼? –

+2

@JonathanLeffler推測「strnchr()」會在終止符被擊中後停止*或者*最大長度被擊中。 'strchr_s'可能是一個更好的名字。但是,當然如果你的數據集中有溢出的字符串,那麼你已經輸了。 – Sneftel

+1

@Sneftel:嗯......有趣......如果你不知道空終止字符串是多長時間,但知道它不長於N個字節,而且你只對搜索最多M個字節感興趣,並且M

回答

15

它確實存在 - 它被稱爲memchr

http://en.wikipedia.org/wiki/C_string_handling

+1

請注意,'memchr'不是* exacly *可能會出現'strnchr'可能會做的事情,因爲如果memchr比n的參數短,它不會停在字符串的末尾(即它可以讀取字節超出'\ 0',與'strchr'不同]。 'memchr'的「n-less」等價物不是'strchr',而是'rawmemchr',一個非POSIX和C99的GNU擴展。 – anol

+1

所以'#define strnchr(haystack,needle,length)memchr(haystack,needle,strnlen(haystack,length))'應該這樣做吧? –

7

在C中,術語「字符串」通常表示「以空字符結尾的字符串」,並且str*函數對這些類型的字符串進行操作。您提到的功能中的n大多是爲了控制輸出

如果您想要在沒有任何隱含終止語義的任意字節字節序列上運行,請使用mem*系列函數;在你的情況下,memchr應該滿足你的需求。

+0

良好洞察力,但爲輸入字符串提供邊界的現有功能的示例是'strncmp()'和'printf(「%。* s」,n,s);'。請注意,'strncmp'的適當手冊頁可以避免說它將字符串作爲參數,但BSD和GNU手冊頁在這方面有點草率。另一方面,C標準措辭完美。 –

+0

還有POSIX的'strnlen()'。 –

+0

@PascalCuoq:有趣。我可能會看兩次任何算法,這些算法被認爲是'strnlen'的一個好用例。 –

相關問題