为什么没有strnspn()和strncspn()?

时间:2014-02-24 23:43:46

标签: c cstring libc

有一个strnlen()函数已经添加了一段时间给各种高知名度的图书馆,随后进入了POSIX-1:2008这样的标准。 IIUC的目的是避免在主题字符串未被终止时出现问题。

但是,我没有看到类似的变体strnspn()strncspn()已经开发出来,尽管可能涉及类似的潜在问题。是因为基础strspn()strcspn()超出了许多C程序员的理解,因此应该是未使用或不可用的?

有人可能会注意到,在(in)着名的“security-enhanced”(又名附件-K或M's-extension)字符串函数的变体中,没有strcspn_s()也没有strspn_s()要么......

3 个答案:

答案 0 :(得分:1)

以防有人实际上正在寻找C memspn()(我当时是在我发现此线程时)

size_t memspn(const char *haystack, const size_t haystack_len, const char *mask, const size_t mask_len){
    size_t ret=0;
    for(;ret<haystack_len;++ret){
        const char c=haystack[ret];
        _Bool found=false;
        for(size_t ii=0;ii<mask_len;++ii){
            if(mask[ii]==c){
                found=true;
                break;
            }
        }
        if(!found){
            return ret;
        }
    }
    return ret;
}

  • 尚未经过广泛测试,但似乎可以正常工作:)

答案 1 :(得分:0)

为什么特定功能没有出现在标准库中的答案通常归结为“没有足够的人说他们需要它来证明强制每个实现提供它,如果你确实需要它,你可以随时自己写或使用已发布的众多版本之一。“

他们无法添加所有内容。在某些时候,会有一个任意的决定来决定在哪里切断。

答案 2 :(得分:0)

strnlen()的存在使得在strspn()中使用它之前首先对字符串进行完整性检查相对容易。

strspn()不常用于strlen()

strspn()接受两个char *参数,因为通常它只是第一个需要长度保护的字符串,所以问题是第二个字符串是否应该具有此函数的长度限制。