此功能可以与两个版本的POSIX兼容吗?

时间:2019-06-28 16:41:00

标签: c posix

这是strspn的简介:

#include <string.h>

size_t strspn(const char *s1, const char *s2);

这是POSIX.1-2001的描述和返回值:

  

strspn()函数应计算s1指向的字符串的最大初始段的长度(以字节为单位),该长度最大部分由s2指向的字符串的字节组成。

     

strspn()函数应返回 s1的长度;没有返回值被保留以指示错误。

(几乎)与POSIX.1-2017相同:

  

strspn()函数应计算s1指向的字符串的最大初始段的长度(以字节为单位),该长度最大部分由s2指向的字符串的字节组成。

     

strspn()函数应返回计算长度;没有返回值被保留以指示错误。

strspn的实现是否可能与POSIX.1-2001和POSIX.1-2017都兼容?怎么样?

2 个答案:

答案 0 :(得分:9)

这是POSIX.1-2001中的错误。

the POSIX description of strspn says

  

此参考页上描述的功能符合ISO C标准。这里描述的要求和ISO C标准之间的任何冲突都是无意的。 IEEE Std 1003.1-2001的这一卷符合ISO C标准。

C标准(ISO 9899:1999,7.21.5.6 strspn函数)明确指出:

  

strspn函数返回段的长度。

较新版本的POSIX修改了措辞,使其与C标准具有相同的含义,而这始终是原定的意图。 (显然是在2006年注意到并进行了更改;请参见https://www.opengroup.org/austin/docs/austin_330.txtcurrent version of strspn in POSIX将此(而不是暗指)称为“ SD5-XSH-ERN-182 ”。更改历史记录部分。)

正如POSIX所说的那样,它“遵循ISO C标准”,我认为在这种情况下(例如在这种情况下),兼容的实现必须遵循C标准。

答案 1 :(得分:4)

是的,计算长度和s1的长度通常会有所不同,这意味着该函数必须违反这些描述之一。

但是第一个显然是措辞上的错误,因为后者肯定是故意的,所以没关系

没有多少人可以断言strspn()是个笨拙的strlen()廉价假货。