有一个strnlen()
函数已经添加了一段时间给各种高知名度的图书馆,随后进入了POSIX-1:2008这样的标准。 IIUC的目的是避免在主题字符串未被终止时出现问题。
但是,我没有看到类似的变体strnspn()
或strncspn()
已经开发出来,尽管可能涉及类似的潜在问题。是因为基础strspn()
和strcspn()
超出了许多C程序员的理解,因此应该是未使用或不可用的?
有人可能会注意到,在(in)着名的“security-enhanced”(又名附件-K或M's-extension)字符串函数的变体中,没有strcspn_s()
也没有strspn_s()
要么......
答案 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 *参数,因为通常它只是第一个需要长度保护的字符串,所以问题是第二个字符串是否应该具有此函数的长度限制。