从标准中并不清楚strncmp
(来自string.h
)的作用。
int strncmp(const char *s1, const char *s2, size_t n);
如果第三个参数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