将非空终止字符串传递给C中的strncmp是否合法?

时间:2017-01-01 20:31:14

标签: c standards standard-library strncmp

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

char segname[16];

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

我想将segname与各种字符串进行比较,例如__text

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

This post认为它是合法的。 This source code也使其合法化。但是我的男人的页面说:

  

strncmp()函数以字典方式比较以null结尾的字符串s1s2

传递给strncmp的尺寸大小为segname

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

2 个答案:

答案 0 :(得分:67)

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

  

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

但请注意,它表示 array 字符。根据定义,如果字符数组不以空值终止,则为字符串。

答案 1 :(得分:15)

  

strncmp函数比较不超过n个字符(字符   从指向的数组开始,不会比较空字符   通过s1到s2指向的数组。

规范7.24.4.2说明了。 C11标准。

不会比较不遵循null charcaters的字符,因此它需要空结束的字符数组或字符串。 1

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

更正

[1] 不会比较不遵循空字符的字符并不意味着let rawData = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: width * height) rawData.initialize(to: 0, count: width * height) // ... rawData.deinitialize() rawData.deallocate(capacity: width * height) 期望以空字符结尾的字符串。这仅仅意味着strncmp需要一个特殊情况,以便(例如)strncmp ...和abc\0def ...比较相等。 比较两个非空终止的char数组(达到指定的长度)或将一个空终止的char数组与另一个非null终止的数组进行比较 没有错
这是直接从 David Hammen的评论

添加的