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)
来自 C11 标准(7.23.1 字符串函数约定)
2如果声明为 size_t n 的参数指定函数的数组长度,则调用该函数时 n 的值可以为零。除非在本节中特定函数的描述中另有明确说明,否则此类调用中的指针参数仍应具有有效值,如 7.1.4 中所述。在此类调用中,定位字符的函数未找到任何匹配项,比较两个字符序列的函数返回零,而复制字符的函数则复制零个字符。
包括C23标准在内的以下C标准中也有同样的记载。
逻辑上是一致的。该参数n指定范围的大小。当n等于0then 时表示范围为空。并且两个空集不能互相大于或小于对方。它们都是空集,因此彼此相等。