在C中传递非空终止的string给strncmp是否合法?
我有一个16字节的数组,其中包含可执行文件段的名称。
char segname[16];
如果段名长度小于16个字节,则其余部分填充空字节。 否则,没有终止的空字节。
我想比较segname
各种string,例如__text
。
用非空终止的string调用strncmp
是否合法?
这篇文章假定它是合法的。 这个源代码也是合法的。 但是我的男人的页面说:
strncmp()
函数按strncmp()
顺序比较以空字符结尾的strings1
和s2
。
传递给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的评论中直接添加的