strncmp(s1, s2, 0) 返回的是未定义的行为(即最后一个参数为零)吗?

Lov*_*ure 7 c c-strings language-lawyer strncmp

从标准中尚不清楚strncmp(来自string.h

int strncmp(const char *s1, const char *s2, size_t n);
Run Code Online (Sandbox Code Playgroud)

n如果其第三个参数是则应返回0

根据C17标准草案,7.24.4.4:

strncmp函数比较不超过n字符(不比较空字符后面的字符)[...]。

strncmp函数返回一个大于、等于或小于零的整数,相应地,因为 指向的 [...] 数组s1大于、等于或小于 指向的 [...] 数组s2

应该strncmp(s1, s2, 0)返回什么?或者标准对strncmp最后一个论点的情况保持沉默0

我的直觉告诉我,0作为返回值最有意义:

  • 0是最“对称”的答案(负或正返回值意味着不对称并且与未进行比较不一致)。
  • 0与假设的模型一致0,直到发现差异、n进行比较或到达字符串末尾。

但上述推理是哲学性的。

似乎该标准在技术上并未声明有关此情况的任何内容。我认为如果这样会更好

  • 显式定义结果(例如0
  • 宣布其为非法。

对于它的价值,glibc给我0(没有警告或错误)一堆简单的测试用例,例如strncmp("abc", "def", 0)使用以下编译器标志:

-Wall -Wextra -std=c90 -pedantic
-Wall -Wextra -std=c17 -pedantic
Run Code Online (Sandbox Code Playgroud)

Vla*_*cow 8

来自 C11 标准(7.23.1 字符串函数约定)

2如果声明为 size_t n 的参数指定函数的数组长度,则调用该函数时 n 的值可以为零。除非在本节中特定函数的描述中另有明确说明,否则此类调用中的指针参数仍应具有有效值,如 7.1.4 中所述。在此类调用中,定位字符的函数未找到任何匹配项,比较两个字符序列的函数返回零,而复制字符的函数则复制零个字符。

包括C23标准在内的以下C标准中也有同样的记载。

逻辑上是一致的。该参数n指定范围的大小。当n等于0then 时表示范围为空。并且两个空集不能互相大于或小于对方。它们都是空集,因此彼此相等。