45

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

char segname[16];

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

我想比较segname各种字符串,例如__text.

strncmp使用非空终止字符串调用是否合法?

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

strncmp()函数按字典顺序比较以 null 结尾的字符串s1s2.

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

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

4

2 回答 2

67

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

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

但是请注意,它说的是字符数组。根据定义,如果字符数组不是以 null 结尾的,则它不是字符串。

于 2017-01-01T20:37:32.633 回答
15

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

规范 7.24.4.2 说明了这一点。C11 标准。

不比较不跟随空字符的字符,因此它需要以空结尾的字符数组或字符串。1

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

更正


[1] 不比较不跟随空字符的字符并不意味着strncmp需要以空字符结尾的字符串。它只是意味着strncmp需要一个特殊情况才能说(例如)abc\0def...和abc\0xyz...比较相等。比较两个非空终止的 char 数组(达到指定长度)或将一个空终止的 char 数组与另一个非空终止的 char 数组进行比较没有任何问题
这是直接从David Hammen的评论中添加的

于 2017-01-01T20:35:43.510 回答