1

我正在比较两个字符串,strcmp(1,2)我得到“-1” 1 我的代码在下面

  <?php
    echo strcmp(1,2);
   ?>

输出:-1

在此处输入图像描述

请让我知道为什么我会因为错误而得到 -1 以及如何处理它?

4

3 回答 3

7

1小于2,strcmp定义为返回:

如果 str1 小于 str2,则返回 < 0;> 0 如果 str1 大于 str2,如果它们相等则为 0。

因此,该行为是预期的。


请注意以下警告:

如果您依赖 strcmp 进行安全的字符串比较,则两个参数都必须是字符串,否则结果非常不可预测。例如,您可能会得到一个意外的 0,或者返回值为 NULL、-2、2、3 和 -3。

来自文档页面上的评论strcmp


PHP 充满了这种意想不到的行为。在您的情况下,我会确保将两个参数都转换为字符串以避免任何混淆:

$first = 1;
$second = 2;
echo strcmp((string)$first, (string)$second);
于 2012-05-15T06:02:47.467 回答
2

当你传入一个 int 时,它会被转换为一个字符串,如下所示:

var_dump(strcmp('1', 2)); //-1

它是 -1 的原因是因为使用最广泛的 strcmp 实现会找到第一个不相等的字符并返回差值。

换句话说,它本质上是 '1' - '2',即 49 - 50('1' 和 '2' 的 ASCII 码)。

49-50 为 -1。

编辑:不严格相关,但出于好奇,做了一些挖掘。这绝不是保证将来的行为,而是从 PHP 5.4 开始:

ZEND_FUNCTION(strcmp)
{
    char *s1, *s2;
    int s1_len, s2_len;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &s1, &s1_len, &s2, &s2_len) == FAILURE) {
        return;
    }

    RETURN_LONG(zend_binary_strcmp(s1, s1_len, s2, s2_len));
}


ZEND_API int zend_binary_strcmp(const char *s1, uint len1, const char *s2, uint len2) /* {{{ */
{
    int retval;

    if (s1 == s2) {
        return 0;
    }
    retval = memcmp(s1, s2, MIN(len1, len2));
    if (!retval) {
        return (len1 - len2);
    } else {
        return retval;
    }
}

它确实转换为字符串。

于 2012-05-15T06:06:33.540 回答
1

你不会得到false

手册

返回值

如果 str1 小于 str2,则返回 < 0;> 0 如果 str1 大于 str2,如果它们相等则为 0。

于 2012-05-15T06:04:08.620 回答