可以用memchr实现吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了可以用memchr实现吗?相关的知识,希望对你有一定的参考价值。

strnlen的实现是否无效?

size_t strnlen(const char *str, size_t maxlen)
{
    char *nul = memchr(str, '', maxlen);
    return nul ? (size_t)(nul - str) : maxlen;
}

我假设memchr总是可以查看maxlen字节,无论这些字节的内容如何。如果没有NUL终结符,strnlen的约定是否只允许查看所有maxlen字节?如果是这样,则str的内存大小可能小于maxlen字节,在这种情况下memchr可能会尝试读取无效的存储位置。这是正确的吗?

答案

[是,发布的实现符合:memchr()不应从str的第一次出现后再从''读取字节。

C17 7.24.5.1 memchr功能

简介

#include <string.h>
void *memchr(const void *s, int c, size_t n);

说明

memchr函数在由c指向的对象的初始unsigned char字符(每个解释为n)中定位unsigned char的首次出现(转换为s)。该实现应表现为好像它顺序读取字符并在找到匹配字符后立即停止。

返回

memchr函数返回指向所定位字符的指针,如果该对象中未出现该字符,则返回空指针。

[memchr可以通过有效的技术来实现,该技术一次测试多个字节,可能会读取超出第一个匹配字节的内容,但前提是这不会引起任何可见的副作用。

另一答案

[我认为无论这些字节的内容如何,​​memchr总是可以查看maxlen字节。

该假设是错误的。 From POSIX

实施应表现为好像它们从s所指向的字节的开头开始逐字节读取内存,并在第一次出现的[[c(如果在初始 n字节)。

以上是关于可以用memchr实现吗?的主要内容,如果未能解决你的问题,请参考以下文章

C 标准库 - string.h之memchr使用

有人知道下面的代码片段是啥意思吗?

一些常用函数,as:strnstr,memchr。。。。。

你可以在graphql服务器模式文件中使用片段吗

有人可以解释以下 R 代码片段吗? [关闭]

PHP必用代码片段