2010-01-02 49 views
10

是否有一个strstr版本可以在可能包含空字符的固定长度的内存上工作?strstr的纯字节版本?

我可以像这样说我的问题: strncpy是作为strstr的memcpy?

+1

更好的是你可以编写一个新的c程序来拥有这样的功能。 我不认为这会是一件复杂的事情。 – Vijay 2010-01-02 18:10:05

回答

14

memmem,不幸的是它是GNU特有的,而不是标准C.但是,它是开源的,所以你可以复制代码(如果许可证适合你)。

7

没有在standard library(这不是那么大,所以看看)。但是编写自己的代码很简单,可以直接逐字节地使用,或者使用memchr(),然后迭代地使用memcmp()。

+0

+1,我喜欢使用memchr和memcpy的想法。您可以逐字逐句执行strstr实现,并将其所有str函数替换为其mem对应项。 – quinmars 2010-01-02 21:55:17

+0

strstr的良好实现根本不是微不足道的 - 它们使用复杂的算法工作得多,速度比平凡的算法快得多。例如,下面是GNU libc中实现的核心:http://bazaar.launchpad.net/~vcs-imports/glibc/master/view/head:/string/str-twoway.h – 2015-09-09 21:22:49

+0

@GregPrice:I我不建议标准库'strstr()'必然是微不足道的;简单地说,即使通常最优解决方案不那么简单,OP所需的功能也可以被轻易实现。标准库实现必须高度优化,因为它们的应用程序未预先知道。在编写特定于应用程序的代码时,只需要快速(或小)足以满足应用程序的需求。在这种特定情况下,类似于您的示例的实现可能是没有根据的。 – Clifford 2015-09-10 09:25:02

0

在标准库中,没有。然而,快速谷歌搜索“安全C字符串库”出现了几个潜在有用的结果。在不了解更多关于您尝试执行的任务的情况下,我无法推荐任何特定的第三方实施。

如果这是唯一的“安全”的功能,你需要超出标准的功能,那么它可能是最好的推出自己的,而不是花费集成第三方库的努力,只要你有信心,你可以这样做不会引入其他错误。

+1

我在问题中看不到“安全”一词。 – 2010-01-02 18:11:35

+0

你是对的,我对这个问题的解释略有不同。广泛阅读“可能包含空值”可能导致相信它也可能不包含空值。由于缺乏空终止是导致人们考虑'strncpy()'(实际上是'strlcpy()')的一个主要问题,所以从这个方向回答我的答案似乎是适当的,因为其他答案已经涵盖了其他方法。我试图说明这一点:“不知道更多关于任务的信息......我不推荐任何特定的第三方实施。”也许我可以更清楚。 – Adam 2010-01-02 18:36:28