我有一个16字节的数组,其中包含可执行文件的名称。
char segname[16];
如果段名长度小于16个字节,则其余部分用空字节填充。否则,没有终止空字节。
我想将segname
与各种字符串进行比较,例如__text
。
使用非空终止字符串调用strncmp
是否合法?
This post认为它是合法的。 This source code也使其合法化。但是我的男人的页面说:
strncmp()
函数以字典方式比较以null结尾的字符串s1
和s2
。
传递给strncmp
的尺寸大小为segname
。
我想知道我应该参考什么。
答案 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的评论