PHP strcmp没有给出正确的输出

时间:2012-05-15 06:01:25

标签: php strcmp

  

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

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

输出:-1

enter image description here

请让我知道为什么我因为假而得到-1以及如何处理它?<​​/ p>

3 个答案:

答案 0 :(得分:6)

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

  

返回&lt;如果str1小于str2,则为0; &GT;如果str1大于,则为0   str2,如果它们相等则为0。

因此行为是预期的。


请注意以下警告:

  

如果依靠strcmp进行安全字符串比较,两个参数都是如此   必须是字符串,结果是非常不可预测的。对于   实例你可能得到一个意外的0,或返回NULL,-2,2的值,   3和-3。

来自strcmp的文档页面上的评论。


PHP充满了这种意外行为。在你的情况下,我会确保两个参数都被转换为字符串以避免混淆:

$first = 1;
$second = 2;
echo strcmp((string)$first, (string)$second);

答案 1 :(得分: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;
    }
}

它确实会转换为字符串。

答案 2 :(得分:1)

你不会得到false

来自manual

  

返回值

     

返回&lt;如果str1小于str2,则为0; &GT;如果str1大于,则为0   str2,如果它们相等则为0。