在C中传递非空终止的string给strncmp是否合法?

我有一个16字节的数组,其中包含可执行文件段的名称。

char segname[16]; 

如果段名长度小于16个字节,则其余部分填充空字节。 否则,没有终止的空字节。

我想比较segname各种string,例如__text

用非空终止的string调用strncmp是否合法?

这篇文章假定它是合法的。 这个源代码也是合法的。 但是我的男人的页面说:

strncmp()函数按strncmp()顺序比较以空字符结尾的strings1s2

传递给strncmp的大小将是segname的大小。

我想知道我应该参考什么。

根据C99标准第7.21.4.4节§3,这是合法的:

strncmp函数返回一个大于,等于或小于零的整数,相应地,由s1指向的可能以null结束的数组大于,等于或小于由s2指向的可能以null结尾的数组。

但是请注意,它表示字符数组 。 根据定义,如果一个字符数组不是以空字符结尾,它不是一个string。

strncmp函数将从s1指向的数组中不超过n个字符(空字符后面的字符不进行比较)与s2指向的数组进行比较。

规范7.24.4.2说。 C11标准。

不跟随空字符的字符不进行比较,因此它期望空字符数组或string。 1

你也可以在这里使用非空终止的字符,但在这种情况下,我们必须指定长度,我们必须检查它在某些情况下是有用的。

更正


[1] 不跟随空字符的字符不被比较并不意味着strncmp期望空终止的string。 这只是说, strncmp需要一个特殊的情况,以便说(例如) abc\0def …和abc\0xyz …比较相等。 比较两个非空终止的字符数组(不超过指定的长度)或比较一个空终止的字符数组与另一个非空终止
这是从David Hammen的评论中直接添加的