Why does "echo strcmp('60', '100');" in php output 5?
Asked Answered
G

3

12

PHP's documentation on this function is a bit sparse and I have read that this function compares ASCII values so...

echo strcmp('hello', 'hello');
//outputs 0 as expected - strings are equal.
echo '<hr />';

echo strcmp('Hello', 'hello');
//outputs -32, a negative number is expected as 
//uppercase H has a lower ASCII value than lowercase h.
echo '<hr />';

echo strcmp('60', '100');
//outputs 5.

The last example is confusing me. I don't understand why it is outputting a positive number.

  • ASCII Value of 0 = 48
  • ASCII Value of 1 = 49
  • ASCII Value of 6 = 54

  • Total ASCII value of '60' = (54 + 48) = 102

  • Total ASCII value of '100' = (49 + 48 + 48) = 145

The strcmp() functions is saying that '60' is "greater" than '100' even though it seems that the ASCII value and string length of '100' is greater than '60'

Can anyone explain why?

Thanks

Galluses answered 15/2, 2012 at 7:41 Comment(0)
E
13

strcmp() returns the difference of the first non-matching character between the strings.

6 - 1 is 5.

When you look at it, you are probably not seeing the characters or digits—just the numbers

Educt answered 15/2, 2012 at 7:43 Comment(4)
Note that this is not guaranteed behaviour -- the only thing guaranteed is that the value will be larger than zero for these input parameters.Buchholz
@SimonRichter: Agreed it is not guaranteed. But it is traditional. Some code I wrote in 1978 which depends on this method of computing the return value still works!Educt
@wallyk, how do you know that this answer is correct when the documentation didn't say that it returns the difference of the first character?Huppah
@Pacerier: I have a lot of experience with a lot of different runtime libraries, from PDP-11s running Unix v6 (the original C), to VAX/VMS, MSDOS, Windows, GCOS, Sequent, IBM, and microcontrollers. They all implement the difference, which, as some CRTL source code indicates, for tradition and perfect compatibility with the original.Educt
B
8

Because strcmp() stops at the first difference it finds. Hence the difference between the ASCII value of '1' and the ASCII value of '6'

Buchenwald answered 15/2, 2012 at 7:45 Comment(1)
@wallyk, how do you know that this behavior is guaranteed when the documentation didn't say that it returns the difference of the first character?Huppah
R
5

6 is 5 "larger" than 1. This is lexical comparison. The first character is different, that's where the comparison stops.

Render answered 15/2, 2012 at 7:45 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.