字符串比较返回的int的实际意义?

时间:2015-07-12 02:40:43

标签: c++ c string

字符串比较似乎是大多数语言的主要内容,它们都具有在某种程度上类似于C strcmp的功能。它的返回值通常如下所述:

  

如果找到s1(或其前n个字节),则strcmp()和strncmp()函数返回小于,等于或大于零的整数,小于,匹配或为大于s2。

除此之外,几乎所有的东西都是如果结果是0那么字符串是相等的(共享相同的内容),如果它非零,那么没有。

但是,如果字符串不相等,非零int值会从何而来?这是什么意思?而且,对于一个字符串来说,这意味着什么呢?"大于"或者"小于"另一个,因为他们不是数值?

感谢您的时间,除了解释0意味着平等和非零意味着不平等之外,我从未见过对字符串比较函数的解释。

2 个答案:

答案 0 :(得分:4)

想想函数最简单的C实现:

int strcmp(char *p1, char *p2)
{
    int diff;
    do
        diff = *p1 - *p2;
    while (*p1++ && *p2++ && diff);
    return diff;
}

返回的值恰好具有正确的符号,但值本身只是比较过程的工件。这就是为什么没有指定该值,为实现者提供尽可能宽的有效实现的范围。

答案 1 :(得分:2)

使用lexicographical order比较字符串,最简单的就是您所谓的“字典排序”:字符串apple小于字符串banana,因为字符{根据我的英语语言环境,{1}}位于字符a之前;但是b跟在apple之后,因为abacus跟在p之后 - 你只是依次比较每个字符。

b没有对其超出符号的非零返回值做出任何特别保证。通常情况下,它们只是strcmp-10,但您不能依赖于此。标准也可以指定+1来返回更具体的枚举:

strcmp

但是许多C标准库函数接受并返回“神奇”enum Ordering { LT, EQ, GT }; 值作为历史事故。