【发布时间】:2014-03-26 22:22:53
【问题描述】:
有一个strnlen() 函数已被添加到各种高调库中已有一段时间,随后进入了POSIX-1:2008 等标准。 IIUC 的目的是避免主题字符串不是以 nul 结尾的问题。
但是,我没有看到类似的变体 strnspn() 或 strncspn() 已经开发出来,尽管可能存在类似的潜在问题。是不是因为基础的strspn()和strcspn()超出了很多C程序员的理解范围,所以应该没用或者不能用?
人们可能会注意到,在著名的“security-enhanced”(又名附件-K 或 M's-extension) 变体中,没有strcspn_s() 也没有@987654329 @ 要么...
【问题讨论】:
-
我的意见是这些提议的函数应该被称为memspn()和memcspn()。使它们与 memcpy() 和 memcmp() 和 memmem() 保持一致。
-
@wildplasser:很有趣。尽管
void*(+ count) 与s1混合在一起,但我认为与s2相对,这仍然是char*。此外,它对memspn()更有意义,因为 s2 的终止\0可以被认为是 span 的一部分,但对于memcspn()则不太明显。 -
@wildplasser:
mem*函数在达到指定的字节数时终止,并且不特殊处理'\0'字符。strn*函数在达到指定字节数时终止或'\0'终止符(嗯,主要是;strncpy有点乱)。 -
我知道。但我觉得需要此类功能的唯一可能情况是在搜索非 NUL 终止的内存段时,例如 mmap()ed 区域。在这种情况下,NUL 相对没有意义。 (并且总是可以事后检查)
-
"are beyond the understanding of many C programmers"- 当然......