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

Bil*_*low 45 c standards standard-library strncmp

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

char segname[16];
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

传递给strncmp的大小将是segname.

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

giu*_*sti 67

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

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

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

  • C99已被取代; C2011是目前的C标准.它在7.24.4.4节中对`strncmp()`的规范确实省略了要比较的数组为空终止的任何要求. (10认同)
  • 然而,应该观察到,省略对空终止的要求不允许在任一输入数组的边界之外进行访问.调用者有责任确保第三个参数适合于避免函数超出任一数组的范围.如果调用者未能这样做,则调用者可能会调用未定义的行为. (9认同)
  • 在解释`<string.h>`的部分的开头,标准说参数`n`指定数组的长度.`strncmp`也不需要NUL.这意味着在`s1`或`s2`之前没有任何内容,并且将访问在s1 + n`或`s2 + n`之外或之外的任何内容. (3认同)
  • 想想看,在最坏的情况下,实现必须在比较中访问`s1`的所有字符.它不会比较与指针不同滞后的字符.我很想说如果`s1`为空终止且小于`s2`,那么`s2`只能在其第一个`strlen(s1)`字符处被访问.但我不确定. (2认同)

use*_*738 15

strncmp函数比较s1指向的数组与s2指向的数组不超过n个字符(不会比较空字符后面的字符).

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

不跟随空charcaters的字符不进行比较,因此它需要空结束字符数组或字符串.1

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

更正


[1] 不会比较不遵循空字符的字符并不意味着strncmp期望以空字符结尾的字符串.它只是意味着strncmp需要一个特殊情况,以便(例如)说abc\0def......和abc\0xyz...比较相等.比较两个非空终止的char数组(达到指定的长度)或者将一个空终止的char数组与另一个非null终止的char数组进行比较没有错.
这是直接从David Hammen的注释中添加的

  • 注意"...跟随一个NULL charcaters ...."更有意义的是"......跟随一个空字符...".`NULL`是与指针关联的_null指针constant_.保存大写的"NULL"以讨论指针. (4认同)
  • "*不跟随空值字符的字符不进行比较,因此它需要空字符结束字符数组或字符串*":答案不正确.你引用的文本为`strncmp`建立了一个**限制**:它永远不会读取空字符*,如果存在*.它没有强制**要求**必须有一个空字符.同样使用`strncmp`你**总是**必须指定应该检查的最大字符数. (2认同)