为什么strcmp()在输入相等时返回0?

Xen*_*enu 15 c

当我调用C字符串比较函数时,如下所示:

strcmp("time","time")

它返回0,这意味着字符串不相等.

任何人都可以告诉我为什么C实现似乎这样做?我认为如果相等,它将返回非零值.我很好奇我看到这种行为的原因.

Ben*_*oît 25

strcmp返回一个词汇差异(或者我应该把它称为"短路串行字节比较器"?:-))你给出的两个字符串作为参数.0表示两个字符串相等

正值意味着s1将在字典中的s2之后.

负值意味着s1将在字典中的s2之前.

因此,当比较明显不同的"时间"和"金钱"时,你的非零值,即使有人会说时间就是金钱!:-)

  • strcmp()不进行词法比较,它只是比较每个字符的值,直到存在差异或两个字符串终止. (3认同)

Dan*_*ant 13

你可以说,像这样的实现的好处是

if(strcmp(<stringA>, <stringB>) > 0)   // Implies stringA > stringB
if(strcmp(<stringA>, <stringB>) == 0)  // Implies stringA == stringB
if(strcmp(<stringA>, <stringB>) < 0)   // Implies stringA < stringB
if(strcmp(<stringA>, <stringB>) >= 0)  // Implies stringA >= stringB
if(strcmp(<stringA>, <stringB>) <= 0)  // Implies stringA <= stringB
if(strcmp(<stringA>, <stringB>) != 0)  // Implies stringA != stringB
Run Code Online (Sandbox Code Playgroud)

注意与0的比较与暗示中的比较完全匹配.

  • comp.lang.c FAQ 中有一个美妙/可怕的宏,它几乎完全实现了这个字符串行为。`#define StrTest(str1, op, str2) (strcmp(str1, str2) op 0)` 有了它,你就可以写出 `if(StrTest(stringA, ==, stringB))` 和朋友们。对于这是一个可怕的想法还是一个绝妙的想法,我持观望态度。 (4认同)

Joh*_*itb 6

函数通常为常见 - 或者一种情况 - 返回零,对于特殊情况则为非零.采用main函数,通常在成功时返回零,并且在失败时返回一些非零值.精确的非零值表示出了什么问题.例如:内存不足,没有访问权限或其他内容.

在你的情况,如果字符串相等,则没有理由为什么它比字符串包含相同的字符等于其他.但如果它们不相等,那么第一个可以更小,或者第二个可以更小.让它返回1表示相等,0表示较小,2表示较大,我认为会有点奇怪.

你也可以用减法来思考它:

return = s1 - s2
Run Code Online (Sandbox Code Playgroud)

如果s1是"按字典顺序"减去,那么它将给出一个负值.